数据类型强制(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 架构中,对 OrdDate 和 ShipDate 属性指定了 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 查询
复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 dataTypeXdr.xml。
复制以下模板,并将它粘贴到文本文件中。在保存 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>
此 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 查询
复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 DataTypeXdr2.xml。
复制以下模板,并将它粘贴到文本文件中。在保存 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"
创建并使用 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>