Предложение FOR (Transact-SQL)

Предложение FOR используется для задания параметра BROWSE или XML. Параметры BROWSE и XML не связаны друг с другом.

Важное примечаниеВажно!

Директива XMLDATA для параметра XML FOR является устаревшей. В режимах RAW и AUTO следует использовать создание XSD-схем. В режиме EXPLICIT для директивы XMLDATA замены нет. В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

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

Синтаксис

[ FOR { BROWSE | <XML> } ]
<XML> ::=
XML 
{ 
    { RAW [ ( 'ElementName' ) ] | AUTO } 
    [ 
        <CommonDirectives> 
        [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ] 
        [ , ELEMENTS [ XSINIL | ABSENT ] 
    ]
  | EXPLICIT 
    [ 
        <CommonDirectives> 
        [ , XMLDATA ] 
    ]
  | PATH [ ( 'ElementName' ) ] 
    [
        <CommonDirectives> 
        [ , ELEMENTS [ XSINIL | ABSENT ] ]
    ]
} 

<CommonDirectives> ::= 
[ , BINARY BASE64 ]
[ , TYPE ]
[ , ROOT [ ( 'RootName' ) ] ]

Аргументы

  • BROWSE
    Активирует возможность обновления данных во время их просмотра с помощью курсора в режиме обзора DB-Library. Таблицу можно просмотреть внутри приложения, если в таблице содержится столбец timestamp, если таблице присвоен уникальный индекс или если в конце инструкции SELECT, отсылаемой экземпляру SQL Server, имеется параметр FOR BROWSE.

    ПримечаниеПримечание

    Нельзя использовать синтаксис <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 в результирующем наборе были добавлены инструкцией правого внешнего соединения.

  • XML
    Задает возврат результатов запроса в виде XML-документа. Должен быть задан один из следующих режимов XML: RAW, AUTO, EXPLICIT. Дополнительные сведения об XML-данных и Службы Analysis Services см. в разделе Создание XML с помощью предложения FOR XML.

  • RAW [ ('ElementName') ]
    Получает результат запроса и преобразует каждую строку результирующего набора в элемент XML, для которого в качестве тега используется общий идентификатор <row />. Дополнительно можно задать имя для элемента строки. Для результирующего выхода в формате XML в качестве элементов, создаваемых для каждой строки, используются определенные ElementName . Дополнительные сведения см. в разделах Использование режима RAW и Использование режима RAW.

  • AUTO
    Возвращает результаты запроса в виде простого вложенного дерева XML. Каждая таблица предложения FROM, для которой в предложении SELECT приведен хотя бы один столбец, отображается как элемент XML. Столбцы, перечисленные в предложении SELECT, сопоставлены с соответствующими атрибутами элемента. Дополнительные сведения см. в разделе Использование режима AUTO.

  • EXPLICIT
    Задает явное определение формы результирующего XML-дерева. При использовании данного режима запросы должны записываться таким образом, чтобы дополнительные сведения о вложениях могли быть заданы явно. Дополнительные сведения см. в разделе Использование режима EXPLICIT.

  • XMLDATA
    Возвращает встроенную XDR-схему, не добавляя корневой элемент к результату. При задании параметра XMLDATA XDR-схема добавляется к документу.

  • XMLSCHEMA [ ('TargetNameSpaceURI') ]
    Возвращает встроенную XSD-схему. При задании указанной директивы, возвращающей заданное пространство имен схемы, дополнительно можно задать URI целевого пространства имен. Дополнительные сведения см. в разделе Создание встроенных XSD-схем.

  • ELEMENTS
    Задает возврат столбцов в виде вложенных элементов. В противном случае столбцы будут сопоставлены с XML-атрибутами. Данный параметр поддерживается только в режимах RAW, AUTO и PATH. Дополнительные сведения см. в разделе Использование режима RAW.

  • XSINIL
    Задает создание элемента с атрибутом xsi:nil, установленного в значение True, для столбцов со значениями NULL. Данный параметр может быть указан только в директиве ELEMENTS. Дополнительные сведения см. в разделе Создание элементов для значений NULL с помощью параметра XSINIL.

  • ABSENT
    Указывает, что соответствующие XML-элементы для столбцов со значениями NULL к XML-результату не добавляются. Указывайте данный параметр только с директивой ELEMENTS.

  • PATH [ ('ElementName') ]
    Создает упаковщик элементов <строки> для каждой строки в результирующем наборе. Для упаковщика элементов <строки> можно дополнительно задать имя элемента. При задании пустой строки, например FOR XML PATH ('') ), упаковщик элементов не создается. Использование директивы PATH дает более простой способ написания запросов, чем написание запросов с помощью директивы EXPLICIT. Дополнительные сведения см. в разделе Использование режима PATH.

  • BINARY BASE64
    Задает возврат двоичных данных запросом в двоичном зашифрованном формате base64. При извлечении двоичных данных с использованием режимов RAW и EXPLICIT необходимо указывать этот параметр. В режиме AUTO это указывается по умолчанию.

  • TYPE
    Задает следующий формат выдаваемых запросом данных: тип xml. Дополнительные сведения см. в разделе Директива TYPE в запросах FOR XML.

  • ROOT [ ('RootName') ]
    Задает добавление единичного элемента высшего уровня к результирующему XML-документу. Дополнительно можно указать имя корневого элемента, который необходимо сформировать. Если имя корневого элемента не задано, то добавляется <корневой> элемент по умолчанию.

Примеры

В данном примере задается параметр FOR XML AUTO с параметрами TYPE и XMLSCHEMA. Благодаря параметру TYPE результирующий набор возвращается клиенту в формате xml. Параметр XMLSCHEMA определяет встроенную XSD-схему, включаемую в возвращаемые XML-данные, а параметр ELEMENTS указывает, что результаты в формате XML основываются на элементах.

USE AdventureWorks2008R2;
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;