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