使用英语阅读

通过


SELECT - FOR 子句 (Transact-SQL)

适用于:Microsoft Fabric Microsoft Fabric SQL 数据库中Microsoft Fabric Warehouse 中的 SQL Server Azure SQL 数据库 Azure SQL 托管实例SQL 分析终结点

使用 FOR 子句指定查询结果的以下查询结果之一。

  • 通过指定 FOR BROWSE在浏览模式游标中查看查询结果时允许更新。

  • 通过指定 FOR XML将查询结果格式化为 XML。

  • 通过指定 FOR JSON将查询结果格式化为 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

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 数据库中,创建一个 tleft 表和一个 tright 表,其中包含名为 c1的单列。 定义 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 查询以在浏览模式下访问表后,SELECT 查询的结果集包含 tleft 表中 c1 列的两个 NULL 值,因为右外部联接语句的定义。 因此,在结果集中,不能区分来自表的 NULL 值以及右外部联接语句引入的 NULL 值。 如果必须忽略结果集中的 NULL 值,可能会收到不正确的结果。

备注

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

FOR XML

XML

指定以 XML 文档返回查询的结果。 必须指定以下 XML 模式之一:RAWAUTOEXPLICIT。 有关 XML 数据和 SQL Server 的详细信息,请参阅 FOR XML (SQL Server)

RAW [ ('ElementName') ]

获取查询结果并将结果集中的每一行转换为一个 XML 元素,其中泛型标识符 <row /> 作为元素标记。 (可选)可以为该行元素指定名称。 生成的 XML 输出使用指定的 ElementName 作为为每个行生成的行元素。 有关详细信息,请参阅 将 RAW 模式与 FOR XML 一起使用

AUTO

以简单的嵌套 XML 树返回查询结果。 FROM 子句中的每个表(其中 SELECT 子句中至少列出一列)都表示为 XML 元素。 SELECT 子句中列出的列映射到相应的元素属性。 有关详细信息,请参阅 将 AUTO 模式与 FOR XML 一起使用

EXPLICIT

指定显式定义产生的 XML 树的形状。 使用该模式要求必须以一种特定的方式编写查询,即显式指定与想要的嵌套有关的其他信息。 有关详细信息,请参阅 将 EXPLICIT 模式与 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 CAST(
    (SELECT column1, column2
        FROM my_table
        FOR XML PATH('')
    )
        AS VARCHAR(MAX)
) AS XMLDATA ;

XMLSCHEMA [ ('TargetNameSpaceURI') ]

返回内联 XSD 架构。 如果指定该指令(用于返回架构中指定的命名空间),则可以选择指定目标命名空间 URI。 有关详细信息,请参阅 生成内联 XSD 架构

ELEMENTS

指定列作为子元素返回。 否则,列将映射到 XML 属性。 此选项仅在 RAWAUTOPATH 模式下受支持。 有关详细信息,请参阅 将 RAW 模式与 FOR XML 一起使用

XSINIL

指定将为 NULL 列值创建 xsi:nil 属性设置为 True 的元素。 只能使用 ELEMENTS 指令指定此选项。 有关详细信息,请参阅:

ABSENT

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

PATH [ ('ElementName') ]

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

BINARY BASE64

指定查询返回二进制 base64 编码格式的二进制数据。 使用 RAWEXPLICIT 模式检索二进制数据时,必须指定此选项。 这是 AUTO 模式下的默认值。

TYPE

指定查询以 xml 类型返回结果。 有关详细信息,请参阅 TYPE Directive in FOR XML Queries

ROOT [ ('RootName') ]

指定将一个顶级元素添加到结果 XML 中。 可以选择指定要生成的根元素名称。 如果未指定可选根名称,则会添加默认 <root> 元素。

有关详细信息,请参阅 FOR XML (SQL Server)

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

对于 JSON

言论

在 Fabric 数据仓库中,FOR JSON 必须是查询中的最后一个运算符,因此不允许在子查询中。

JSON

指定 FOR JSON,返回已格式化为 JSON 文本的查询结果。 还必须指定以下某项 JSON 模式:AUTO 或 PATH。 有关 FOR JSON 子句的详细信息,请参阅 使用 FOR JSON 将查询结果格式化为 JSON

AUTO

通过指定 FOR JSON AUTO,根据 SELECT 语句的结构自动设置 JSON 输出的格式。 有关详细信息和示例,请参阅在 AUTO 模式下自动格式化 JSON 输出 (SQL Server)

PATH

通过指定 FOR JSON PATH来完全控制 JSON 输出的格式。 PATH 模式允许你创建包装器对象和嵌套复杂属性。 有关详细信息和示例,请参阅在 PATH 模式下设置嵌套的 JSON 输出格式 (SQL Server)

INCLUDE_NULL_VALUES

使用 FOR JSON 子句指定 INCLUDE_NULL_VALUES 选项,在 JSON 输出中包含 NULL 值。 如果未指定此选项,则输出不包括查询结果中 NULL 值的 JSON 属性。 有关详细信息和示例,请参阅使用 INCLUDE_NULL_VALUES 选项将 NULL 值包含在 JSON 输出中 (SQL Server)

ROOT [ ('RootName') ]

使用 FOR JSON 子句指定 ROOT 选项,将单个顶级元素添加到 JSON 输出。 如果未指定 ROOT 选项,则 JSON 输出没有根元素。 有关详细信息和示例,请参阅使用 ROOT 选项将根节点添加到 JSON 输出中 (SQL Server)

WITHOUT_ARRAY_WRAPPER

使用 FOR JSON 子句指定 WITHOUT_ARRAY_WRAPPER 选项,删除默认将 JSON 输出括起来的方括号。 如果不指定此选项,JSON 输出将括在方括号中。 使用 WITHOUT_ARRAY_WRAPPER 选项生成单个 JSON 对象作为输出。 有关详细信息,请参阅使用 WITHOUT_ARRAY_WRAPPER 选项从 JSON 输出中删除方括号 (SQL Server)

有关详细信息,请参阅借助 FOR JSON 将查询结果格式化为 JSON (SQL Server)