数据类型强制(XDR 架构)

重要说明重要提示

本主题是针对早期应用程序提供的参考,以后不会就该功能继续进行开发。请避免在新的开发工作中使用此功能,而应使用带批注的 XSD 架构来创建 XML 视图。有关详细信息,请参阅带批注的 XSD 架构简介 (SQLXML 4.0)。可以将现有带批注的 XDR 架构转换为 XSD 架构。有关详细信息,请参阅将带批注的 XDR 架构转换为等效的 XSD 架构 (SQLXML 4.0)

可以在 XDR 架构中指定元素或属性的数据类型。使用 XDR 架构从数据库中提取数据时,相应的数据格式将作为查询结果输出。dt:type 和 sql:datatype 批注用于控制 XDR 数据类型和 Microsoft SQL Server 数据类型之间的映射。

dt:type

可以使用 dt:type 属性指定映射到某列的属性或元素的 XML 数据类型。可以对 <AttributeType><ElementType> 指定 dt:type 属性。dt:type 影响从服务器返回的文档,还影响执行的 XPath 查询。对包含 dt:type 的映射架构执行 XPath 查询时,XPath 使用处理查询时所指示的数据类型。有关 XPath 如何使用 dt:type 的详细信息,请参阅 XPath 数据类型 (SQLXML 4.0)

在返回的文档中,所有 SQL Server 数据类型都转换为字符串表示形式。某些数据类型需要其他转换。下表列出用于各种 dt:type 值的转换。

XML 数据类型

SQL Server 转换

bit

CONVERT(bit, COLUMN)

date

LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)

fixed.14.4

CONVERT(money, COLUMN)

id/idref/idrefs

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

nmtoken/nmtokens

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

time/time.tz

SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)

其他

无其他转换

请注意,某些 SQL Server 值无法转换为某些 XML 数据类型,可能是由于无法转换(例如无法将 "XYZ" 转换为数字数据类型),或是由于值超出了该数据类型的范围(例如,将 -100000 转换为 ui2)。不兼容的类型转换可能导致无效的 XML 文档或 SQL Server 错误。

从 SQL Server 数据类型映射到 XML 数据类型

下表显示从 SQL Server 数据类型到 XML 数据类型的自然映射。

SQL Server 数据类型

XML 数据类型

bigint

i8

binary

bin.base64

bit

boolean

char

char

datetime

datetime

decimal

r8

float

r8

image

bin.base64

int

int

money

r8

nchar

string

ntext

string

nvarchar

string

numeric

r8

real

r4

smalldatetime

datetime

smallint

i2

smallmoney

fixed.14.4

sysname

string

text

string

timestamp

ui8

tinyint

ui1

varbinary

bin.base64

varchar

string

uniqueidentifier

uuid

sql:datatype

XML 数据类型 bin.base64 映射到各种 Microsoft SQL Server 数据类型(binary、image、varbinary)。若要明确地将 XML 数据类型 bin.base64 映射到特定的 SQL Server 数据,可使用 sql:datatype 批注。sql:datatype 指定属性映射到的列的 SQL Server 数据类型。

这在数据存储在数据库中时很有用。通过指定 sql:datatype 批注,可以标识显式 SQL Server 数据类型。数据项随后存储为在 sql:datatype 中指定的类型。

sql:datatype 批注支持所有 SQL Server 内置数据类型。(不支持用户定义的数据类型或同义词。)还支持精度和小数位数,例如 sql:datatype="nvarchar"and sql:datatype="nchar(10)"。

在映射架构中指定 XDR 和 SQL Server 数据类型可以帮助消除 SQL 查询中的不必要数据转换。例如,XPath 必须从 SQL Server 数据类型转换为 XDR 数据类型,然后从 XDR 类型转换为 XPath 类型。如果指定了 sql:datatype 或 XDR 类型并且 XPath 确定该转换是不必要的,XPath 就不会进行转换。

对于主键列,消除这些转换能够显著提高性能。例如,以下查询通常要求将 CustomerID 转换为 string (nvarchar) 以保证结果正确无误:

Customer[@CustomerID='ALFKI']

如果使用 sql:datatype="nvarchar" 在架构中对 CustomerID 进行了批注,XPath 可以避免不必要的数据转换。

示例

若要创建使用以下示例的工作示例,必须满足某些要求。有关详细信息,请参阅运行 SQLXML 示例的要求

A. 对属性指定 dt:type

在这个 XDR 架构中,对 OrdDateShipDate 属性指定了 dt:type。

对于 ReqDate 属性,未指定 XPath 数据类型。因此,XPath 返回从数据库的 RequiredDate 列中检索的 SQL Server 日期时间值。

OrdDate 属性指定了 "date" XPath 数据类型。XPath 仅返回从 OrderDate 列中检索的值的日期部分(而不返回时间)。

对 ShipDate 属性指定了 "time" XPath 数据类型。XPath 仅返回从 ShippedDate 列中检索的值的时间部分(而不返回日期)。

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="Order" sql:relation="Orders">
    <AttributeType name="OID" />
    <AttributeType name="CustID"  />
    <AttributeType name="OrdDate" dt:type="date" />
    <AttributeType name="ReqDate" />
    <AttributeType name="ShipDate" dt:type="time" />

    <attribute type="OID" sql:field="OrderID" />
    <attribute type="CustID" sql:field="CustomerID" />
    <attribute type="OrdDate" sql:field="OrderDate" />
    <attribute type="ReqDate" sql:field="RequiredDate" />
    <attribute type="ShipDate" sql:field="ShippedDate" />
</ElementType>
</Schema>

针对该架构测试示例 XPath 查询

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 dataTypeXdr.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 dataTypeXdr.xml 的目录中将该文件另存为 dataTypeXdrT.xml。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="dataTypeXdr.xml">
        /Order[@OID=43860]
      </sql:xpath-query>
    </ROOT>
    
  3. 此 URL 执行以下模板:

    http://IISServer/AdventureWorks/template/dataTypeXdrT.xml
    

下面是结果集:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order OID="43860" CustID="1" OrdDate="2001-08-01" ReqDate="2001-08-13T00:00:00" ShipDate="00:00:00" /> 
</ROOT>

B. 对属性指定 sql:datatype

在本示例中,sql:datatype 用于标识 LargePhoto 列的 SQL Server 数据类型。

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="ProductPhoto" sql:relation="Production.ProductPhoto">
    <AttributeType name="PhotoID" />
    <AttributeType name="filename" />
    <AttributeType name="photo" sql:datatype="image"  />

    <attribute type="PhotoID" sql:field="ProductPhotoID" />
    <attribute type="filename" sql:field="LargePhotoFileName" />
    <attribute type="photo" sql:field="LargePhoto" />
</ElementType>
</Schema>

针对该架构测试示例 XPath 查询

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 DataTypeXdr2.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 DataTypeXdr2.xml 的目录中将该文件另存为 DataTypeXdr2T.xml。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="DataTypeXdr2.xml">
        /ProductPhoto[@PhotoID="100"]
      </sql:xpath-query>
    </ROOT>
    

    为映射架构 (DataTypeXdr2.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:

    mapping-schema="C:\MyDir\DataTypeXdr2.xml"
    
  3. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

    有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询

下面是结果集:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
    <ProductPhoto PhotoID="100" filename="racer02_red_large.gif" 
 photo="Binary_base64_image_returned_here"/> 
</ROOT>