Шаг 178 - Свойство SQL

Описание
Задает или возвращает инструкцию SQL, которая определяет запрос, выполняемый объектом QueryDef.

Значение
Задаваемое или возвращаемое значение является выражением типа String, содержащим инструкцию SQL.

Замечания
Свойство SQL содержит инструкцию SQL, которая определяет отбор, группировку и упорядочивание записей при выполнении запроса. Запросы можно использовать для отбора записей, которые следует включить в объект Recordset. Кроме того, существуют запросы на изменение записей, позволяющие изменять данные без возвращения записей.
Синтаксис инструкций SQL, используемый в запросе, должен отвечать версии языка SQL, используемой ядром запросов, что в свою очередь зависит от типа рабочей области. В рабочей области Microsoft Jet следует использовать версии языка SQL ядра Microsoft Jet, за исключением запросов к серверу SQL. В последнем случае следует использовать версию SQL, которую поддерживает сервер. В рабочей области ODBCDirect также следует использовать версию SQL, поддерживаемую сервером.
Пользователь имеет возможность с помощью средств ODBCDirect отправлять запросы DAO на различные серверы баз данных. При этом следует помнить, что разные серверы могут использовать различающиеся диалекты языка SQL. Поэтому из справочной системы исключена контекстная правка языка Microsoft Jet SQL, хотя интерактивная справочная система Microsoft Jet SQL по-прежнему доступна в меню. При использовании подключений ODBCDirect или запросов к серверу в приложения, использующих подключения через ядро Microsoft Jet, проверяйте по документации сервера, какой диалект языка SQL использует сервер базы данных.
Если инструкция SQL включает параметры запроса, пользователь должен задать значения этих параметров до выполнения запроса. До явного изменения значений параметров эти же значения будут применяться при каждом новом запуске запроса.
В рабочей области ODBCDirect свойство SQL используют также для выполнения инструкции, сохраненной на сервере. Например, следующая строка, заданная в свойстве SQL, вызовет выполнение на сервере Microsoft SQL Server сохраненной инструкции с именем «GetData» и одним параметром.

"{call GetData (?)}"

В рабочей области Microsoft Jet объекты QueryDef являются лучшим средством выполнения запросов к серверу SQL для источников данных ODBC, подключенных к ядру Microsoft Jet. Указав в значении свойства Connect объекта QueryDef источник данных ODBC, пользователь имеет возможность применять в запросе, передаваемом на внешний сервер, диалект SQL, отличный от используемого ядром Microsoft Jet. Например, для баз данных, использующих Microsoft SQL Server или Sybase SQL Server, допускается указание в аргументе значение инструкций TRANSACT SQL, которые не обрабатываются ядром Microsoft Jet.
Если значение свойства задается путем слияния строки с нецелым числом, а в системной настройке задано использование десятичного разделителя, отличного от десятичной точки (например, запятой, как в следующем примере: strFilter = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке выполнить объект QueryDef в базе данных Microsoft Jet возникнет ошибка. Причина заключается в том, что при слиянии строк число преобразуется в строковое значение с использованием текущего системного десятичного разделителя, а в языке Microsoft Jet SQL распознается только американский символ десятичного разделителя (точка).

Пример
Следующая программа использует метод CopyQueryDef для создания копии объекта QueryDef на основе существующего объекта Recordset, а затем изменяет копию, добавляя предложение в свойство SQL. При создании постоянных объектов QueryDef можно добавлять в значение свойства SQL пробел, точку с запятой или символ перевода строки; но эти лишние символы должны быть удалены перед добавлением в инструкцию SQL любого нового предложения.

Function CopyQueryNew(rstTemp As Recordset, strAdd As String) As QueryDef

	Dim strSQL As String
	Dim strRightSQL As String

	Set CopyQueryNew = rstTemp.CopyQueryDef
	With CopyQueryNew
		' Удаляет лишние символы.
		strSQL = .SQL
		strRightSQL = Right(strSQL, 1)
		Do While strRightSQL = " " Or strRightSQL = ";" Or _
				strRightSQL = Chr(10) Or strRightSQL = vbCr
			strSQL = Left(strSQL, Len(strSQL) - 1)
			strRightSQL = Right(strSQL, 1)

	Loop
		.SQL = strSQL & strAdd
	End With

End Function

'Следующая программа демонстрирует возможное использование функции CopyQueryNew().

Sub CopyQueryDefX()

	Dim dbsNorthwind As Database
	Dim qdfEmployees As QueryDef
	Dim rstEmployees As Recordset
	Dim intCommand As Integer
	Dim strOrderBy As String
	Dim qdfCopy As QueryDef
	Dim rstCopy As Recordset

	Set dbsNorthwind = OpenDatabase("Борей.mdb")
	Set qdfEmployees = dbsNorthwind.CreateQueryDef("NewQueryDef", "SELECT Имя, Фамилия, ДатаРождения " & 	"FROM Сотрудники")
	Set rstEmployees = qdfEmployees.OpenRecordset(dbOpenForwardOnly)

	Do While True
		intCommand = Val(InputBox( "Выберите поле для сортировки объекта " & _
			"Recordset:" &vbCr & "1 - Имя" & vbCr & 	"2 - Фамилия" & vbCr & "3 - ДатаРождения" & _
			vbCr & "[Отмена - выход]"))
		Select Case intCommand
			Case 1
				strOrderBy = " ORDER BY Имя"
			Case 2
				strOrderBy = " ORDER BY Фамилия"
			Case 3
				strOrderBy = " ORDER BY ДатаРождения"
			Case Else
				Exit Do
		End Select

		Set qdfCopy = CopyQueryNew(rstEmployees, strOrderBy)
		Set rstCopy = qdfCopy.OpenRecordset(dbOpenSnapshot, dbForwardOnly)
		With rstCopy
			Do While Not .EOF
				Debug.Print !Фамилия & ", " & !Имя & 	" - " &!ДатаРождения
				.MoveNext
			Loop
			.Close
		End With
		Exit Do
	Loop

	rstEmployees.Close
	' Удаляет объект QueryDef, добавленный только для демонстрации.
	dbsNorthwind.QueryDefs.Delete qdfEmployees.Name
	dbsNorthwind.Close

End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 11.04.2002