SELECT - FOR, предложение (Transact-SQL)SELECT - FOR Clause (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

Предложение FOR используется для указания одного из следующих параметров для результатов запроса.Use the FOR clause to specify one of the following options for query results.

  • Разрешение обновлений при просмотре результатов запроса в курсоре режима просмотра с помощью FOR BROWSE.Allow updates while viewing query results in a browse mode cursor by specifying FOR BROWSE.

  • Форматирование результатов запроса в формате XML с помощью FOR XML.Format query results as XML by specifying FOR XML.

  • Форматирование результатов запроса в формате JSON с помощью FOR JSON.Format query results as JSON by specifying FOR JSON.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

[ 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 BROWSEFOR BROWSE

BROWSEBROWSE
Активирует возможность обновления данных во время их просмотра с помощью курсора в режиме обзора DB-Library.Specifies that updates be allowed while viewing the data in a DB-Library browse mode cursor. Таблицу можно просмотреть внутри приложения, если в таблице содержится столбец timestamp, таблице присвоен уникальный индекс или в конце инструкции SELECT, отсылаемой экземпляру SQL ServerSQL Server, имеется параметр FOR BROWSE.A table can be browsed in an application if the table includes a timestamp column, the table has a unique index, and the FOR BROWSE option is at the end of the SELECT statements sent to an instance of SQL ServerSQL Server.

Примечание

Нельзя использовать синтаксис <lock_hint> HOLDLOCK для инструкции SELECT, включающей в себя параметр FOR BROWSE.You cannot use the <lock_hint> HOLDLOCK in a SELECT statement that includes the FOR BROWSE option.

Параметр FOR BROWSE не может быть использован в инструкциях SELECT, соединенных оператором UNION.FOR BROWSE cannot appear in SELECT statements that are joined by the UNION operator.

Примечание

Если ключевые столбцы уникального индекса таблицы могут принимать неопределенные значения, а таблица находится внутри внешнего соединения, индексы в режиме обзора не поддерживаются.When the unique index key columns of a table are nullable, and the table is on the inner side of an outer join, the index is not supported by browse mode.

Режим просмотра позволяет просматривать строки в таблице SQL ServerSQL Server и обновлять данные в таблице по одной строке одновременно.The browse mode lets you scan the rows in your SQL ServerSQL Server table and update the data in your table one row at a time. Чтобы получить доступ к таблице SQL ServerSQL Server в приложении в режиме просмотра, необходимо использовать один из следующих вариантов.To access a SQL ServerSQL Server table in your application in the browse mode, you must use one of the following two options:

  • Инструкция SELECT, применяемая для получения доступа к данным таблицы SQL ServerSQL Server, должна оканчиваться ключевыми словами FOR BROWSE.The SELECT statement that you use to access the data from your SQL ServerSQL Server table must end with the keywords FOR BROWSE. Если для использования режима просмотра включен параметр FOR BROWSE, создаются временные таблицы.When you turn on the FOR BROWSE option to use browse mode, temporary tables are created.

  • Необходимо выполнить следующую инструкцию Transact-SQLTransact-SQL, чтобы включить режим просмотра с параметром NO_BROWSETABLE:You must run the following Transact-SQLTransact-SQL statement to turn on the browse mode by using the NO_BROWSETABLE option:

    SET NO_BROWSETABLE ON  
    

    После включения параметра NO_BROWSETABLE все инструкции SELECT действуют так, как если бы к инструкциям был добавлен параметр FOR BROWSE.When you turn on the NO_BROWSETABLE option, all the SELECT statements behave as if the FOR BROWSE option is appended to the statements. Однако параметр NO_BROWSETABLE не создает временные таблицы, которые обычно используются параметром FOR BROWSE, чтобы передать результаты в приложение.However, the NO_BROWSETABLE option does not create the temporary tables that the FOR BROWSE option generally uses to send the results to your application.

Если предпринимается попытка получить доступ к данным таблиц SQL ServerSQL Server в режиме просмотра с помощью запроса SELECT, содержащего инструкцию внешнего соединения, и если определен уникальный индекс в таблице, которая присутствует во внутренней части инструкции внешнего соединения, в режиме просмотра не поддерживается уникальный индекс.When you try to access the data from SQL ServerSQL Server tables in browse mode by using a SELECT query that involves an outer join statement, and when a unique index is defined on the table that is present on the inner side of an outer join statement, the browse mode does not support the unique index. В режиме просмотра уникальный индекс поддерживается, только если все ключевые столбцы уникального индекса могут принимать значения NULL.The browse mode supports the unique index only when all the unique index key columns can accept null values. Уникальный индекс не поддерживается в режиме просмотра, если следующие условия являются истинными.The browse mode does not support the unique index if the following conditions are true:

  • Предпринимается попытка получить доступ к данным таблиц SQL ServerSQL Server в режиме просмотра с использованием запроса SELECT, содержащего инструкцию внешнего соединения.You try to access the data from SQL ServerSQL Server tables in browse mode by using a SELECT query that involves an outer join statement.

  • Уникальный индекс определен на таблице, которая присутствует во внутренней части инструкции внешнего соединения.A unique index is defined on the table that is present on the inner side of an outer join statement.

Чтобы воспроизвести это поведение в режиме просмотра, выполните следующие шаги.To reproduce this behavior in the browse mode, follow these steps:

  1. В среде SQL Server Management StudioSQL Server Management Studio создайте базу данных с именем SampleDB.In SQL Server Management StudioSQL Server Management Studio, create a database, named SampleDB.

  2. В базе данных SampleDB создайте таблицы tleft и tright так, чтобы каждая содержала один столбец с именем c1.In the SampleDB database, create a tleft table and a tright table that both contain a single column that is named c1. Определите уникальный индекс на столбце c1 в таблице tleft и предусмотрите, чтобы этот столбец принимал значения NULL.Define a unique index on the c1 column in the tleft table, and set the column to accept null values. Чтобы это сделать, выполните в соответствующем окне запроса следующие инструкции Transact-SQLTransact-SQL:To do this, run the following Transact-SQLTransact-SQL statements in an appropriate query window:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. Вставьте несколько значений в таблицу tleft и таблицу tright.Insert several values in the tleft table and the tright table. Обязательно вставьте значение NULL в таблицу tleft.Make sure that you insert a null value in the tleft table. Чтобы это сделать, выполните в окне запроса следующие инструкции Transact-SQLTransact-SQL:To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    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.Turn on the NO_BROWSETABLE option. Чтобы это сделать, выполните в окне запроса следующие инструкции Transact-SQLTransact-SQL:To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. Получите доступ к данным в таблице tleft и таблице tright с помощью инструкции внешнего соединения в запросе SELECT.Access the data in the tleft table and the tright table by using an outer join statement in the SELECT query. Убедитесь, что таблица tleft находится во внутренней части инструкции внешнего соединения.Make sure that the tleft table is on the inner side of the outer join statement. Чтобы это сделать, выполните в окне запроса следующие инструкции Transact-SQLTransact-SQL:To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    SELECT tleft.c1   
    FROM tleft   
    RIGHT JOIN tright   
    ON tleft.c1 = tright.c1   
    WHERE tright.c1 <> 2 ;
    

    Обратите внимание на следующие выходные данные на панели «Результаты»:Notice the following output in the Results pane:

    c1c1

    ----

    NULLNULL

    NULLNULL

После выполнения запроса SELECT для получения доступа к таблицам в режиме просмотра результирующий набор запроса SELECT содержит два значения NULL для столбца c1 в таблице tleft, поскольку таково определение инструкции правого внешнего соединения.After you run the SELECT query to access the tables in the browse mode, the result set of the SELECT query contains two null values for the c1 column in the tleft table because of the definition of the right outer join statement. Поэтому в результирующем наборе невозможно различить значения NULL, полученные из таблицы, и значения NULL, добавленные инструкцией правого внешнего соединения.Therefore, in the result set, you cannot distinguish between the null values that came from the table and the null values that the right outer join statement introduced. Могут быть получены неверные результаты, если необходимо пропустить значения NULL из результирующего набора.You might receive incorrect results if you must ignore the null values from the result set.

Примечание

Если столбцы, которые включены в уникальный индекс, не допускают значения NULL, это значит, что все значения NULL в результирующем наборе были добавлены инструкцией правого внешнего соединения.If the columns that are included in the unique index do not accept null values, all the null values in the result set were introduced by the right outer join statement.

FOR XMLFOR XML

XMLXML
Задает возврат результатов запроса в виде XML-документа.Specifies that the results of a query are to be returned as an XML document. Должен быть задан один из следующих режимов XML: RAW, AUTO, EXPLICIT.One of the following XML modes must be specified: RAW, AUTO, EXPLICIT. Дополнительные сведения о данных XML и SQL ServerSQL Server см. в статье FOR XML (SQL Server).For more information about XML data and SQL ServerSQL Server, see FOR XML (SQL Server).

RAW [ (' имя_элемента ') ]RAW [ ('ElementName') ]
Получает результат запроса и преобразует каждую строку результирующего набора в элемент XML, для которого в качестве тега используется общий идентификатор <row />.Takes the query result and transforms each row in the result set into an XML element with a generic identifier <row /> as the element tag. Дополнительно можно задать имя для элемента строки.You can optionally specify a name for the row element. Полученный в результате выходной XML-файл будет использовать указанное имя ElementName в качестве элемента, сформированного для каждой строки.The resulting XML output uses the specified ElementName as the row element generated for each row. Дополнительные сведения см. в статье Использование с RAW Mode для FOR XML.For more information, see Use RAW Mode with FOR XML.

AUTOAUTO
Возвращает результаты запроса в виде простого вложенного дерева XML.Returns query results in a simple, nested XML tree. Каждая таблица предложения FROM, для которой в предложении SELECT приведен хотя бы один столбец, отображается как элемент XML.Each table in the FROM clause, for which at least one column is listed in the SELECT clause, is represented as an XML element. Столбцы, перечисленные в предложении SELECT, сопоставлены с соответствующими атрибутами элемента.The columns listed in the SELECT clause are mapped to the appropriate element attributes. Дополнительные сведения см. в статье Использование с AUTO Mode для FOR XML.For more information, see Use AUTO Mode with FOR XML.

EXPLICITEXPLICIT
Указывает, что форма конечного дерева XML определена явно.Specifies that the shape of the resulting XML tree is defined explicitly. При использовании данного режима запросы должны записываться таким образом, чтобы дополнительные сведения о вложениях могли быть заданы явно.Using this mode, queries must be written in a particular way so that additional information about the desired nesting is specified explicitly. Дополнительные сведения см. в статье Использование с EXPLICIT Mode для FOR XML.For more information, see Use EXPLICIT Mode with FOR XML.

XMLDATAXMLDATA
Возвращает встроенную XDR-схему, не добавляя корневой элемент к результату.Returns inline XDR schema, but does not add the root element to the result. При задании параметра XMLDATA XDR-схема добавляется к документу.If XMLDATA is specified, XDR schema is appended to the document.

Важно!

Директива XMLDATA не рекомендуется к использованию.The XMLDATA directive is deprecated. В режимах RAW и AUTO следует использовать создание XSD-схем.Use XSD generation in the case of RAW and AUTO modes. В режиме EXPLICIT для директивы XMLDATA замены нет.There is no replacement for the XMLDATA directive in EXPLICIT mode. В будущей версии Microsoft SQL Server этот компонент будет удален.This feature will be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Подавление нежелательных разрывов строки: вы можете использовать SQL Server Management Studio (SSMS) для выдачи запроса, использующего предложение FOR XML.Suppress unwanted line breaks: You might use SQL Server Management Studio (SSMS) to issue a query that uses the FOR XML clause. Иногда большой объем кода XML возвращается и отображается в одной ячейке.Sometimes a large amount of XML is returned and displayed in one grid cell. Длина этой строки XML может превышать максимальную длину одной строки в ячейке сетки SSMS.The XML string could be longer than one SSMS grid cell can hold on a single line. В этих случаях SSMS может вставить символы разрыва строки между длинными сегментами одной строки XML.In these cases, SSMS might insert line break characters between long segments of the whole XML string. Такие разрывы строки могут возникнуть в середине подстроки, которую недопустимо разбивать между двумя строками.Such line breaks might occur in the middle of a substring that should not be split across lines. Вы можете запретить эти разрывы строки с помощью приведения AS XMLDATA.You can prevent the line breaks by using a cast AS XMLDATA. Это решение также можно применять при использовании FOR JSON PATH.This solution can also apply when you use FOR JSON PATH. Эта методика описана на форму Stack Overflow и приведена в следующем примере инструкции SELECT на языке Transact-SQL:The technique is discussed on Stack Overflow, and is shown in the following Transact-SQL sample SELECT statement:

XMLSCHEMA [ (' URI_целевого_пространства_имен ') ]XMLSCHEMA [ ('TargetNameSpaceURI') ]
Возвращает встроенную XSD-схему.Returns inline XSD schema. При задании указанной директивы, возвращающей заданное пространство имен схемы, дополнительно можно задать URI целевого пространства имен.You can optionally specify a target namespace URI when you specify this directive, which returns the specified namespace in the schema. Дополнительные сведения см. в разделе Создание встроенных схем XSD.For more information, see Generate an Inline XSD Schema.

ELEMENTSELEMENTS
Задает возврат столбцов в виде вложенных элементов.Specifies that the columns are returned as subelements. В противном случае они сопоставляются с XML-атрибутами.Otherwise, they are mapped to XML attributes. Данный параметр поддерживается только в режимах RAW, AUTO и PATH.This option is supported in RAW, AUTO and PATH modes only. Дополнительные сведения см. в статье Использование с RAW Mode для FOR XML.For more information, see Use RAW Mode with FOR XML.

XSINILXSINIL
Задает создание элемента с атрибутом xsi:nil, установленного в значение True, для столбцов со значениями NULL.Specifies that an element with xsi:nil attribute set to True be created for NULL column values. Данный параметр может быть указан только в директиве ELEMENTS.This option can only be specified with ELEMENTS directive. Дополнительные сведения см. в разделе:For more information, see:

ABSENTABSENT
Указывает, что соответствующие XML-элементы для столбцов со значениями NULL к XML-результату не добавляются.Indicates that for null column values, corresponding XML elements will not be added in the XML result. Указывайте данный параметр только с директивой ELEMENTS.Specify this option only with ELEMENTS.

PATH [ (' имя_элемента ') ]PATH [ ('ElementName') ]
Создает упаковщик элементов <row> для каждой строки в результирующем наборе.Generates a <row> element wrapper for each row in the result set. Для упаковщика элементов <row> можно дополнительно задать имя элемента.You can optionally specify an element name for the <row> element wrapper. При задании пустой строки, например FOR XML PATH ( '' ) ), упаковщик элементов не создается.If an empty string is provided, such as FOR XML PATH ('') ), a wrapper element is not generated. Использование директивы PATH дает более простой способ написания запросов, чем написание запросов с помощью директивы EXPLICIT.Using PATH may provide a simpler alternative to queries written using the EXPLICIT directive. Дополнительные сведения см. в статье Использование с PATH Mode для FOR XML.For more information, see Use PATH Mode with FOR XML.

BINARY BASE64BINARY BASE64
Задает возврат двоичных данных запросом в двоичном зашифрованном формате base64.Specifies that the query returns the binary data in binary base64-encoded format. При извлечении двоичных данных с использованием режимов RAW и EXPLICIT необходимо указывать этот параметр.When you retrieve binary data by using RAW and EXPLICIT mode, this option must be specified. В режиме AUTO это указывается по умолчанию.This is the default in AUTO mode.

TYPETYPE
Задает следующий формат выдаваемых запросом данных: тип xml.Specifies that the query returns results as xml type. Дополнительные сведения см. в статье TYPE Directive in FOR XML Queries.For more information, see TYPE Directive in FOR XML Queries.

ROOT [ (' имя_корневого_элемента ') ]ROOT [ ('RootName') ]
Задает добавление единичного элемента высшего уровня к результирующему XML-документу.Specifies that a single top-level element be added to the resulting XML. Дополнительно можно указать имя корневого элемента, который необходимо сформировать.You can optionally specify the root element name to generate. Если имя корневого элемента не задано, то добавляется элемент <root> по умолчанию.If the optional root name is not specified, the default <root> element is added.

Дополнительные сведения см. в разделе FOR XML (SQL Server).For more info, see FOR XML (SQL Server).

Пример FOR XMLFOR XML Example

В данном примере задается параметр FOR XML AUTO с параметрами TYPE и XMLSCHEMA.The following example specifies FOR XML AUTO with the TYPE and XMLSCHEMA options. Благодаря параметру TYPE результирующий набор возвращается клиенту в формате xml.Because of the TYPE option, the result set is returned to the client as an xml type. Параметр XMLSCHEMA определяет встроенную XSD-схему, включаемую в возвращаемые XML-данные, а параметр ELEMENTS указывает, что результаты в формате XML основываются на элементах.The XMLSCHEMA option specifies that the inline XSD schema is included in the XML data returned, and the ELEMENTS option specifies that the XML result is element-centric.

USE AdventureWorks2012;  
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 JSONFOR JSON

JSONJSON
Укажите FOR JSON, чтобы вернуть результаты запроса в формате текста JSON.Specify FOR JSON to return the results of a query formatted as JSON text. Также нужно указать один из следующих режимов JSON: AUTO или PATH.You also have to specify one of the following JSON modes : AUTO or PATH. Дополнительные сведения о предложении FOR JSON см. в разделе Форматирование результатов запроса как JSON с помощью предложения FOR JSON (SQL Server).For more information about the FOR JSON clause, see Format Query Results as JSON with FOR JSON (SQL Server).

AUTOAUTO
Форматируйте выходные данные JSON автоматически на основе структуры инструкции SELECT,Format the JSON output automatically based on the structure of the SELECT statement
указав FOR JSON AUTO.by specifying FOR JSON AUTO. Дополнительные сведения и примеры см. в разделе Автоматическое форматирование выходных данных JSON в режиме AUTO (SQL Server).For more info and examples, see Format JSON Output Automatically with AUTO Mode (SQL Server).

PATHPATH
Чтобы сохранить полный контроль над форматом выходных данных JSON, используйтеGet full control over the format of the JSON output by specifying
FOR JSON PATH.FOR JSON PATH. РежимPATH позволяет создавать объекты-оболочки и вкладывать сложные свойства друг в друга.PATH mode lets you create wrapper objects and nest complex properties. Дополнительные сведения и примеры см. в разделе Форматирование вложенных выходных данных JSON в режиме PATH (SQL Server).For more info and examples, see Format Nested JSON Output with PATH Mode (SQL Server).

INCLUDE_NULL_VALUESINCLUDE_NULL_VALUES
Включайте значения NULL в выходные данные JSON, указав параметр INCLUDE_NULL_VALUES для предложения FOR JSON.Include null values in the JSON output by specifying the INCLUDE_NULL_VALUES option with the FOR JSON clause. Если не указать этот параметр, в выходные данные не будут включены свойства JSON для значений NULL в результатах запроса.If you don't specify this option, the output does not include JSON properties for null values in the query results. Дополнительные сведения и примеры см. в статье Использование параметра INCLUDE_NULL_VALUES для включения значений NULL в выходные данные JSON (SQL Server).For more info and examples, see Include Null Values in JSON Output with the INCLUDE_NULL_VALUES Option (SQL Server).

ROOT [ (' имя_корневого_элемента ') ]ROOT [ ('RootName') ]
Добавьте один элемент верхнего уровня к выходным данным JSON, указав параметр ROOT с предложение FOR JSON.Add a single, top-level element to the JSON output by specifying the ROOT option with the FOR JSON clause. Если не указать параметр ROOT , выходные данные JSON не будут содержать корневой элемент.If you don't specify the ROOT option, the JSON output doesn't have a root element. Дополнительные сведения и примеры см. в разделе Добавление корневого узла в выходные данные JSON с параметром ROOT (SQL Server).For more info and examples, see Add a Root Node to JSON Output with the ROOT Option (SQL Server).

WITHOUT_ARRAY_WRAPPERWITHOUT_ARRAY_WRAPPER
Удалите квадратные скобки, в которые заключаются выходные данные JSON по умолчанию, указав параметр WITHOUT_ARRAY_WRAPPER с предложением FOR JSON.Remove the square brackets that surround the JSON output by default by specifying the WITHOUT_ARRAY_WRAPPER option with the FOR JSON clause. Если не указать этот параметр, выходные данные JSON будут заключены в квадратные скобки.If you don't specify this option, the JSON output is enclosed within square brackets. Параметр WITHOUT_ARRAY_WRAPPER позволяет создать в качестве выходных данных единый объект JSON.Use the WITHOUT_ARRAY_WRAPPER option to generate a single JSON object as output. Дополнительные сведения см. в разделе Удаление квадратных скобок из выходных данных JSON с помощью параметра WITHOUT_ARRAY_WRAPPER (SQL Server).For more info, see Remove Square Brackets from JSON Output with the WITHOUT_ARRAY_WRAPPER Option (SQL Server).

Дополнительные сведения см. в разделе Форматирование результатов запроса как JSON с помощью предложения FOR JSON (SQL Server).For more info, see Format Query Results as JSON with FOR JSON (SQL Server).

См. также:See Also

SELECT (Transact-SQL)SELECT (Transact-SQL)