SELECT - FOR, предложение (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в Microsoft Fabric
Предложение FOR используется для указания одного из следующих параметров для результатов запроса.
Разрешение обновлений при просмотре результатов запроса в курсоре режима просмотра с помощью FOR BROWSE.
Форматирование результатов запроса в формате XML с помощью FOR XML.
Форматирование результатов запроса в формате JSON с помощью FOR JSON.
Соглашения о синтаксисе Transact-SQL
Синтаксис
[ FOR { BROWSE | <XML> | <JSON>} ]
<XML> ::=
XML
{
{ RAW [ ( 'ElementName' ) ] | AUTO }
[
<CommonDirectivesForXML>
[ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]
[ , ELEMENTS [ XSINIL | ABSENT ]
]
| EXPLICIT
[
<CommonDirectivesForXML>
[ , XMLDATA ]
]
| PATH [ ( 'ElementName' ) ]
[
<CommonDirectivesForXML>
[ , ELEMENTS [ XSINIL | ABSENT ] ]
]
}
<CommonDirectivesForXML> ::=
[ , BINARY BASE64 ]
[ , TYPE ]
[ , ROOT [ ( 'RootName' ) ] ]
<JSON> ::=
JSON
{
{ AUTO | PATH }
[
[ , ROOT [ ( 'RootName' ) ] ]
[ , INCLUDE_NULL_VALUES ]
[ , WITHOUT_ARRAY_WRAPPER ]
]
}
FOR BROWSE
ОБЗОР
Активирует возможность обновления данных во время их просмотра с помощью курсора в режиме обзора DB-Library. Таблица может просматриваться в приложении, если таблица содержит столбец метки времени, таблица имеет уникальный индекс, а параметр FOR BROWSE находится в конце инструкций SELECT, отправляемых экземпляру SQL Server.
Примечание.
Нельзя использовать синтаксис <lock_hint> HOLDLOCK в инструкции SELECT, включающей в себя параметр FOR BROWSE.
Параметр FOR BROWSE не может быть использован в инструкциях SELECT, соединенных оператором UNION.
Примечание.
Если ключевые столбцы уникального индекса таблицы могут принимать неопределенные значения, а таблица находится внутри внешнего соединения, индексы в режиме обзора не поддерживаются.
Режим обзора позволяет сканировать строки в таблице SQL Server и обновлять данные в таблице по одной строке. Чтобы получить доступ к таблице SQL Server в приложении в режиме обзора, необходимо использовать один из следующих двух вариантов:
Инструкция SELECT, используемая для доступа к данным из таблицы SQL Server, должна заканчиваться ключевыми словами FOR BROWSE. Если для использования режима просмотра включен параметр FOR BROWSE, создаются временные таблицы.
Необходимо выполнить следующую инструкцию Transact-SQL, чтобы включить режим просмотра с параметром NO_BROWSETABLE:
SET NO_BROWSETABLE ON
После включения параметра NO_BROWSETABLE все инструкции SELECT действуют так, как если бы к инструкциям был добавлен параметр FOR BROWSE. Однако параметр NO_BROWSETABLE не создает временные таблицы, которые обычно используются параметром FOR BROWSE, чтобы передать результаты в приложение.
При попытке получить доступ к данным из таблиц SQL Server в режиме обзора с помощью запроса SELECT, включающего инструкцию внешнего соединения, и при определении уникального индекса в таблице, которая присутствует во внутренней части инструкции внешнего соединения, режим обзора не поддерживает уникальный индекс. В режиме просмотра уникальный индекс поддерживается, только если все ключевые столбцы уникального индекса могут принимать значения NULL. Уникальный индекс не поддерживается в режиме просмотра, если следующие условия являются истинными.
Вы пытаетесь получить доступ к данным из таблиц SQL Server в режиме обзора с помощью запроса SELECT, который включает внешнюю инструкцию соединения.
Уникальный индекс определен на таблице, которая присутствует во внутренней части инструкции внешнего соединения.
Чтобы воспроизвести это поведение в режиме просмотра, выполните следующие шаги.
В SQL Server Management Studio создайте базу данных с именем SampleDB.
В базе данных SampleDB создайте таблицы tleft и tright так, чтобы каждая содержала один столбец с именем c1. Определите уникальный индекс на столбце c1 в таблице tleft и предусмотрите, чтобы этот столбец принимал значения NULL. Для этого выполните в соответствующем окне запроса следующие инструкции Transact-SQL:
CREATE TABLE tleft(c1 INT NULL UNIQUE) ; GO CREATE TABLE tright(c1 INT NULL) ; GO
Вставьте несколько значений в таблицу tleft и таблицу tright. Обязательно вставьте значение NULL в таблицу tleft. Для этого выполните в окне запроса следующие инструкции Transact-SQL:
INSERT INTO tleft VALUES(2) ; INSERT INTO tleft VALUES(NULL) ; INSERT INTO tright VALUES(1) ; INSERT INTO tright VALUES(3) ; INSERT INTO tright VALUES(NULL) ; GO
Включите параметр NO_BROWSETABLE. Для этого выполните в окне запроса следующие инструкции Transact-SQL:
SET NO_BROWSETABLE ON ; GO
Получите доступ к данным в таблице tleft и таблице tright с помощью инструкции внешнего соединения в запросе SELECT. Убедитесь, что таблица tleft находится во внутренней части инструкции внешнего соединения. Для этого выполните в окне запроса следующие инструкции Transact-SQL:
SELECT tleft.c1 FROM tleft RIGHT JOIN tright ON tleft.c1 = tright.c1 WHERE tright.c1 <> 2 ;
Обратите внимание на следующие выходные данные на панели «Результаты»:
c1
----
NULL
NULL
После выполнения запроса SELECT для получения доступа к таблицам в режиме просмотра результирующий набор запроса SELECT содержит два значения NULL для столбца c1 в таблице tleft, поскольку таково определение инструкции правого внешнего соединения. Поэтому в результирующем наборе невозможно различить значения NULL, полученные из таблицы, и значения NULL, добавленные инструкцией правого внешнего соединения. Могут быть получены неверные результаты, если необходимо пропустить значения NULL из результирующего набора.
Примечание.
Если столбцы, которые включены в уникальный индекс, не допускают значения NULL, это значит, что все значения NULL в результирующем наборе были добавлены инструкцией правого внешнего соединения.
FOR XML
XML
Задает возврат результатов запроса в виде XML-документа. Должен быть задан один из следующих режимов XML: RAW, AUTO, EXPLICIT. Дополнительные сведения о данных XML и SQL Server см. в разделе FOR XML (SQL Server).
RAW [ ('имя_элемента') ]
Получает результат запроса и преобразует каждую строку результирующего набора в элемент XML, для которого в качестве тега используется обобщенный дескриптор <row />. Дополнительно можно задать имя для элемента строки. Полученный в результате выходной XML-файл будет использовать указанное имя ElementName в качестве элемента, сформированного для каждой строки. Дополнительные сведения см. в статье Использование с RAW Mode для FOR XML.
АВТОМАТИЧЕСКИ
Возвращает результаты запроса в виде простого вложенного дерева XML. Каждая таблица предложения FROM, для которой в предложении SELECT приведен хотя бы один столбец, отображается как элемент XML. Столбцы, перечисленные в предложении SELECT, сопоставлены с соответствующими атрибутами элемента. Дополнительные сведения см. в статье Использование с AUTO Mode для FOR XML.
EXPLICIT
Указывает, что форма конечного дерева XML определена явно. При использовании данного режима запросы должны записываться таким образом, чтобы дополнительные сведения о вложениях могли быть заданы явно. Дополнительные сведения см. в статье Использование с EXPLICIT Mode для FOR XML.
XMLDATA
Возвращает встроенную XDR-схему, не добавляя корневой элемент к результату. При задании параметра XMLDATA XDR-схема добавляется к документу.
Внимание
Директива XMLDATA не рекомендуется к использованию. В режимах RAW и AUTO следует использовать создание XSD-схем. В режиме EXPLICIT для директивы XMLDATA замены нет. Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.
Подавление нежелательных разрывов строк: вы можете использовать SQL Server Management Studio (SSMS) для выдачи запроса, использующего предложение FOR XML. Иногда большой объем кода XML возвращается и отображается в одной ячейке. Длина этой строки XML может превышать максимальную длину одной строки в ячейке сетки SSMS. В этих случаях SSMS может вставить символы разрыва строки между длинными сегментами одной строки XML. Такие разрывы строки могут возникнуть в середине подстроки, которую недопустимо разбивать между двумя строками. Вы можете запретить эти разрывы строки с помощью приведения AS XMLDATA. Это решение также можно применять при использовании FOR JSON PATH. Эта методика описана на форму Stack Overflow и приведена в следующем примере инструкции SELECT на языке Transact-SQL:
-
SELECT CAST( (SELECT column1, column2 FROM my_table FOR XML PATH('') ) AS VARCHAR(MAX) ) AS XMLDATA ;
XMLSCHEMA [ ('URI_целевого_пространства_имен') ]
Возвращает встроенную XSD-схему. При задании указанной директивы, возвращающей заданное пространство имен схемы, дополнительно можно задать URI целевого пространства имен. Дополнительные сведения см. в разделе Создание встроенных схем XSD.
ELEMENTS
Задает возврат столбцов в виде вложенных элементов. В противном случае они сопоставляются с XML-атрибутами. Данный параметр поддерживается только в режимах RAW, AUTO и PATH. Дополнительные сведения см. в статье Использование с RAW Mode для FOR XML.
XSINIL
Задает создание элемента с атрибутом xsi:nil, установленного в значение True, для столбцов со значениями NULL. Данный параметр может быть указан только в директиве ELEMENTS. Дополнительные сведения см. в разделе:
ABSENT
Указывает, что соответствующие XML-элементы для столбцов со значениями NULL к XML-результату не добавляются. Указывайте данный параметр только с директивой ELEMENTS.
PATH [ ('имя_элемента') ]
Создает упаковщик элементов <row> для каждой строки в результирующем наборе. Для упаковщика элементов <row> можно дополнительно задать имя элемента. При задании пустой строки, например FOR XML PATH ('') ), упаковщик элементов не создается. Использование директивы PATH дает более простой способ написания запросов, чем написание запросов с помощью директивы EXPLICIT. Дополнительные сведения см. в статье Использование с PATH Mode для FOR XML.
BINARY BASE64
Задает возврат двоичных данных запросом в двоичном зашифрованном формате base64. При извлечении двоичных данных с использованием режимов RAW и EXPLICIT необходимо указывать этот параметр. В режиме AUTO это указывается по умолчанию.
ТИП
Задает следующий формат выдаваемых запросом данных: тип xml. Дополнительные сведения см. в статье TYPE Directive in FOR XML Queries.
ROOT [ ('имя_корневого_элемента') ]
Задает добавление единичного элемента высшего уровня к результирующему XML-документу. Дополнительно можно указать имя корневого элемента, который необходимо сформировать. Если имя необязательного корневого элемента не задано, то добавляется элемент <root> по умолчанию.
Дополнительные сведения см. в разделе FOR XML (SQL Server).
Пример FOR XML
В данном примере задается параметр FOR XML AUTO
с параметрами TYPE
и XMLSCHEMA
. Благодаря параметру TYPE
результирующий набор возвращается клиенту в формате xml. Параметр XMLSCHEMA
определяет встроенную XSD-схему, включаемую в возвращаемые XML-данные, а параметр ELEMENTS
указывает, что результаты в формате XML основываются на элементах.
USE AdventureWorks2022;
GO
SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone
FROM Person.Person AS p
JOIN Person.PersonPhone AS pph ON p.BusinessEntityID = pph.BusinessEntityID
WHERE LastName LIKE 'G%'
ORDER BY LastName, FirstName
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;
FOR JSON
JSON
Укажите FOR JSON, чтобы вернуть результаты запроса в формате текста JSON. Также необходимо указать один из следующих режимов JSON: AUTO или PATH. Дополнительные сведения о предложении FOR JSON см. в разделе Форматирование результатов запроса как JSON с помощью предложения FOR JSON (SQL Server).
АВТОМАТИЧЕСКИ
Форматируйте выходные данные JSON автоматически на основе структуры инструкции SELECT,
указав FOR JSON AUTO. Дополнительные сведения и примеры см. в разделе Автоматическое форматирование выходных данных JSON в режиме AUTO (SQL Server).
ПУТЬ
Чтобы сохранить полный контроль над форматом выходных данных JSON, используйте
FOR JSON PATH. РежимPATH позволяет создавать объекты-оболочки и вкладывать сложные свойства друг в друга. Дополнительные сведения и примеры см. в разделе Форматирование вложенных выходных данных JSON в режиме PATH (SQL Server).
INCLUDE_NULL_VALUES
Включайте значения NULL в выходные данные JSON, указав параметр INCLUDE_NULL_VALUES для предложения FOR JSON. Если не указать этот параметр, в выходные данные не будут включены свойства JSON для значений NULL в результатах запроса. Дополнительные сведения и примеры см. в разделе Использование параметра INCLUDE_NULL_VALUES для включения значений NULL в выходные данные JSON (SQL Server).
ROOT [ ('имя_корневого_элемента') ]
Добавьте один элемент верхнего уровня к выходным данным JSON, указав параметр ROOT с предложение FOR JSON. Если не указать параметр ROOT , выходные данные JSON не будут содержать корневой элемент. Дополнительные сведения и примеры см. в разделе Добавление корневого узла в выходные данные JSON с параметром ROOT (SQL Server).
WITHOUT_ARRAY_WRAPPER
Удалите квадратные скобки, в которые заключаются выходные данные JSON по умолчанию, указав параметр WITHOUT_ARRAY_WRAPPER с предложением FOR JSON. Если не указать этот параметр, выходные данные JSON будут заключены в квадратные скобки. Параметр WITHOUT_ARRAY_WRAPPER позволяет создать в качестве выходных данных единый объект JSON. Дополнительные сведения см. в разделе Удаление квадратных скобок из выходных данных JSON с помощью параметра WITHOUT_ARRAY_WRAPPER (SQL Server).
Дополнительные сведения см. в разделе Форматирование результатов запроса как JSON с помощью предложения FOR JSON (SQL Server).