xml 数据类型的限制

下列限制适用于 xml 数据类型:

  • 不能用作 sql_variant 实例的子类型

  • 不支持转换为 textntext

  • 不支持下面这些列和表约束:

    • PRIMARY KEY/ FOREIGN KEY
    • UNIQUE
    • COLLATE
      XML 提供了它自己的编码。排序规则只适用于字符串类型。xml 数据类型不是字符串类型。但是,它有字符串表示形式并允许与字符串数据类型之间的相互转换。
    • RULE
  • 不能进行比较或排序。这意味着 xml 数据类型不能用在 GROUP BY 语句中。

  • 不能在分布式分区视图使用。

  • 可以在具体化视图中创建。具体化视图不能基于 xml 数据类型方法。但可以转换为不同于基表中的 xml 类型列的 XML 架构集合。

  • 不能用作除了 ISNULL、COALESCE 和 DATALENGTH 之外的任何内置标量函数的参数。

  • 不能用作索引中的键列。但可以作为数据包含在聚集索引中;如果创建了非聚集索引,也可以使用 INCLUDE 关键字显式添加到该非聚集索引中。

  • 如果实例存储在数据库中,将不保留该实例中的 XML 声明 PI。例如:

    CREATE TABLE T1 (Col1 int primary key, Col2 xml)
    GO
    INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>')
    GO
    SELECT Col2
    FROM T1
    

    结果为 <doc/>
    xml 数据类型实例中存储 XML 数据时,将不保留 XML 声明 PI(例如 <?xml version='1.0'?>)。这是默认设置。XML 声明 (<?xml ...?>) 及其属性 (version/encoding/stand-alone) 在数据被转换为 xml 类型后将丢失。XML 声明被视为对 XML 分析器的指令。XML 数据将被内部存储为 ucs-2。将保留 XML 实例中的所有其他 PI。

  • 不保留 XML 实例中的属性顺序。查询存储在 xml 类型列中的 XML 实例时,所得 XML 中的属性顺序可能与原 XML 实例中的顺序不同。

  • 默认情况下,不保留无关紧要的空格。例如:

    DECLARE @x xml
    SET @x = '<root>      <child/>     </root>'
    SELECT @x 
    

    这将返回以下结果:

    <root><child/></root>
    

    不过,您可以更改此行为。若要保留 xml 数据类型实例中的空格,请使用 CONVERT 运算符并将其可选的 style 参数设置为 1。例如:

    SELECT CONVERT(xml, N'<root>      <child/>     </root>', 1)
    

    如果未使用 style 参数,或该参数的值设置为 0,则在 xml 数据类型实例的转换中将不保留无关紧要的空格。有关在将字符串数据转换为 xml 数据类型实例时如何使用 CONVERT 运算符及其 style 参数的详细信息,请参阅CAST 和 CONVERT (Transact-SQL)

  • 不保留属性值前后的单引号和双引号。属性值作为名称和值对存储在数据库中。不存储引号。对 XML 实例执行 XQuery 时,将用属性值前后的双引号对所得 XML 进行序列化。

    DECLARE @x xml
    -- Use double quotation marks.
    SET @x = '<root a="1" />'
    SELECT @x
    GO
    DECLARE @x xml
    -- Use single quotation marks.
    SET @x = '<root a=''1'' />'
    SELECT @x
    GO
    

    两个查询都返回 <root a="1" />

  • 不保留命名空间前缀。对 xml 类型列指定 XQuery 时,序列化的 XML 结果可能会返回不同的命名空间前缀。

    DECLARE @x xml
    SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc">
                <ns2:SomeElement/>
              </ns1:root>'
    SELECT @x
    SELECT @x.query('/*')
    GO
    

    结果中的命名空间前缀可能会有所不同。例如:

    <p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>
    
  • 如果将 XML 作为字符串文字复制并粘贴到 SQL Server Management Studio 中的查询编辑器窗口,可能会遇到 [N]VARCHAR 字符串编码不兼容的情况。这将取决于 XML 实例的编码。在很多情况下,您可能需要删除 XML 声明。例如:

    <?xml version="1.0" encoding="UTF-8"?>
      <xsd:schema … 
    

    然后,应包含 N 以使 XML 实例成为 Unicode 实例。例如:

    -- Assign XML instance to a variable.
    DECLARE @X XML
    SET @X = N'?
    -- Insert XML instance into an xml type column.
    INSERT INTO T VALUES (N'?)
    -- Create an XML schema collection
    CREATE XML SCHEMA COLLECTION XMLCOLL1 AS N'<xsd:schema ?'
    
  • SQL Server 将把 xml 数据类型实例(例如使用 TYPE 指令或在其中使用 xml 数据类型从 SQL 列、变量和输出参数返回 XML 的 FOR XML 查询)作为不同服务器构造的结果返回到客户端。在客户端应用程序代码中,ADO.NET 访问接口请求以二进制编码形式从服务器发送此 xml 数据类型信息。但是,如果使用不带 TYPE 指令的 FOR XML,则 XML 数据将作为字符串类型返回。在任何情况下,客户端访问接口都始终能够处理其中任一种形式的 XML 内容。

请参阅

概念

示例 XML 应用程序
类型化与非类型化的 XML
生成 XML 实例
XML 数据修改语言 (XML DML)
xml 数据类型

其他资源

XML 数据类型方法

帮助和信息

获取 SQL Server 2005 帮助