Описание
Задает или возвращает инструкцию 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