FOR 子句 (Transact-SQL)

FOR 子句用来指定 BROWSE 或 XML 选项。BROWSE 和 XML 是无关的选项。

重要说明重要提示

不推荐使用 FOR XML 选项的 XMLDATA 指令。如果是 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 列,并且表有唯一索引,而且在发送到 SQL Server 实例的 SELECT 语句中 FOR BROWSE 选项位于末尾,则可以在应用程序中浏览该表。

    注意注意

    不能在包括 FOR BROWSE 选项的 SELECT 语句中使用 <lock_hint> HOLDLOCK。

    FOR BROWSE 不能出现在由 UNION 运算符所联接的 SELECT 语句中。

    注意注意

    如果表的唯一索引键列可为空,并且表在外部联接的内侧,则浏览模式不支持索引。

    使用浏览模式可以扫描 SQL Server 表中的行并逐行更新表中的数据。若要以浏览模式访问应用程序中的 SQL Server 表,必须使用下列两个选项之一:

    • 用于访问 SQL Server 表的数据的 SELECT 语句必须以 FOR BROWSE 关键字结尾。启用 FOR BROWSE 选项以使用浏览模式时,将创建临时表。

    • 您必须运行以下 Transact-SQL 语句,以使用 NO_BROWSETABLE 选项打开浏览模式:

      SET NO_BROWSETABLE ON
      

      启用 NO_BROWSETABLE 选项时,所有 SELECT 语句的行为就像在这些语句后追加了 FOR BROWSE 选项一样。但是,NO_BROWSETABLE 选项不会创建 FOR BROWSE 选项通常用于向应用程序发送结果的临时表。

    当使用涉及外部联接语句的 SELECT 查询尝试以浏览模式访问 SQL Server 表中的数据,并且当对外部联接语句内侧已存在的表定义唯一索引时,浏览模式不支持此唯一索引。仅当所有唯一索引键列可接受 Null 值时,浏览模式才支持唯一索引。如果满足下列条件,浏览模式不支持唯一索引:

    • 通过使用涉及外部联接语句的 SELECT 查询尝试以浏览模式访问 SQL Server 中的数据。

    • 对外部联接语句内侧已存在的表定义唯一索引。

    若要在浏览模式下重现此行为,请按下列步骤操作:

    1. 在 SQL Server Management Studio 中,创建一个名为 SampleDB 的数据库。

    2. 在 SampleDB 数据库中,创建均包含名为 c1 的列的 tleft 表和 tright 表。对 tleft 表中的 c1 列定义唯一索引,并将此列设置为接受 Null 值。为此,请在相应的查询窗口中运行下列 Transact-SQL 语句:

      CREATE TABLE tleft(c1 INT NULL UNIQUE) ;
      GO 
      CREATE TABLE tright(c1 INT NULL) ;
      GO
      
    3. 在 tleft 表和 tright 表中插入多个值。请确保在 tleft 表中插入一个 Null 值。为此,请在查询窗口中运行下列 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. 通过在 SELECT 查询中使用外部联接语句来访问 tleft 表和 tright 表中的数据。请确保 tleft 表位于外部联接语句的内侧。为此,请在查询窗口中运行下列 Transact-SQL 语句:

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

      请注意“结果”窗格中的以下输出:

      c1

      ----

      NULL

      NULL

    在运行 SELECT 查询以便以浏览模式访问表之后,对于 tleft 表中的 c1 列,SELECT 查询的结果集包含两个 Null 值,这是因为在右外部联接语句中定义了该列。因此,您无法在结果集中区分源自该表的 Null 值和右外部联接语句引入的 Null 值。如果必须忽略结果集的 Null 值,则可能收到错误结果。

    注意注意

    如果唯一索引中包含的列不接受 Null 值,则结果集中的所有 Null 值都是由右外部联接语句引入的。

  • XML
    指定以 XML 文档返回查询的结果。必须指定下列 XML 模式之一:RAW、AUTO、EXPLICIT。有关 XML 数据和 SQL Server 的详细信息,请参阅使用 FOR XML 构造 XML

  • RAW [ ('ElementName') ]
    获得查询结果并将结果集内的每一行转换为以一般标识符 <row /> 作为元素标记的 XML 元素。(可选)可以为该行元素指定名称。所得到的 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
    指定为 NULL 列值创建其 xsi:nil 属性设置为 True 的元素。该选项只能与 ELEMENTS 指令一起指定。有关详细信息,请参阅使用 XSINIL 参数生成 NULL 值对应的元素

  • ABSENT
    指示对于空列值,将不在 XML 结果中添加对应的 XML 元素。该选项只能与 ELEMENTS 一起指定。

  • PATH [ ('ElementName') ]
    为结果集中的每一行生成 <row> 元素包装。(可选)可以为 <row> 元素包装指定元素名称。如果提供了空字符串(例如 FOR XML PATH ('')),则不生成包装元素。使用 PATH 可能为使用 EXPLICIT 指令所编写的查询提供更简单的代替方案。有关详细信息,请参阅使用 PATH 模式

  • BINARY BASE64
    指定查询返回二进制 base64 编码格式的二进制数据。使用 RAW 和 EXPLICIT 模式检索二进制数据时,必须指定该选项。这是 AUTO 模式中的默认值。

  • TYPE
    指定查询以 xml 类型返回结果。有关详细信息,请参阅 FOR XML 查询中的 TYPE 指令

  • ROOT [ ('RootName') ]
    指定将一个顶级元素添加到结果 XML 中。(可选)可以指定要生成的根元素名称。如果不指定可选的根名称,则添加默认的 <root> 元素。

示例

以下示例指定具有 TYPE 和 XMLSCHEMA 选项的 FOR XML AUTO。由于有 TYPE 选项,因此,结果集将作为 xml 类型返回到客户端。XMLSCHEMA 选项指定在所返回的 XML 数据中包括内联 XSD 架构,而 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;