SELECT - FOR, предложение (Transact-SQL)
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных 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
, EXPLICIT
. Дополнительные сведения о данных XML и SQL Server см. в разделе FOR XML (SQL Server).
RAW [ ('ElementName') ]
Принимает результат запроса и преобразует каждую строку в результирующем наборе в 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
, как показано в следующем Transact-SQL примере SELECT
инструкции SELECT
:
SELECT CAST(
(SELECT column1, column2
FROM my_table
FOR XML PATH('')
)
AS VARCHAR(MAX)
) AS XMLDATA ;
XMLSCHEMA [ ('TargetNameSpaceURI') ]
Возвращает встроенную XSD-схему. При задании указанной директивы, возвращающей заданное пространство имен схемы, дополнительно можно задать URI целевого пространства имен. Дополнительные сведения см. в разделе Создание встроенных схем XSD.
ELEMENTS
Задает возврат столбцов в виде вложенных элементов. В противном случае они сопоставляются с XML-атрибутами. Этот параметр поддерживается только в режимах RAW
, AUTO
и PATH
. Дополнительные сведения см. в статье Использование с RAW Mode для FOR XML.
XSINIL
Указывает, что элемент с атрибутом xsi:nil
имеет значение True для значений столбцов NULL
. Этот параметр можно указать только с директивой ELEMENTS
. Дополнительные сведения см. в разделе:
ABSENT
Указывает, что для значений столбцов NULL
соответствующие XML-элементы не будут добавлены в xml-результат. Указывайте данный параметр только с директивой ELEMENTS.
PATH [ ('ElementName') ]
Создает оболочку элемента <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 [ ('RootName') ]
Задает добавление единичного элемента высшего уровня к результирующему XML-документу. Дополнительно можно указать имя корневого элемента, который необходимо сформировать. Если необязательное корневое имя не указано, добавляется элемент <root>
по умолчанию.
Дополнительные сведения см. в разделе FOR XML (SQL Server).
Пример
В данном примере задается параметр 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
Замечания
В хранилище данных Fabric 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 [ ('RootName') ]
Добавьте один элемент верхнего уровня в выходные данные 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).