Поделиться через


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, который включает внешнюю инструкцию соединения.

  • Уникальный индекс определен на таблице, которая присутствует во внутренней части инструкции внешнего соединения.

Чтобы воспроизвести это поведение в режиме просмотра, выполните следующие шаги.

  1. В СРЕДЕ SQL Server Management Studio создайте базу данных с именем SampleDB.

  2. В базе данных SampleDB создайте таблицу tleft и таблицу tright, содержащую один столбец с именем c1. Определите уникальный индекс столбца c1 в таблице tleft и задайте столбец для принятия NULL значений. Для этого выполните в соответствующем окне запроса следующие инструкции Transact-SQL:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. Вставьте несколько значений в таблицу 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  
    
  4. Включите параметр NO_BROWSETABLE. Для этого выполните в окне запроса следующие инструкции Transact-SQL:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. Доступ к данным в таблице 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, AUTOEXPLICIT, 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).