数据类型强制和 sql:datatype 批注 (SQLXML 4.0)
在 XSD 架构中,xsd:type 属性指定元素或属性的 XSD 数据类型。在 XSD 架构用于从数据库中提取数据时,指定的数据类型用于将数据格式化。
除了在架构中指定 XSD 类型之外,还可以使用 sql:datatype 批注来指定 Microsoft SQL Server 数据类型。xsd:type 和 sql:datatype 属性控制 XSD 数据类型和 SQL Server 数据类型之间的映射。
xsd:type 属性
可以使用 xsd:type 属性指定映射到某列的属性或元素的 XML 数据类型。xsd:type 影响从服务器返回的文档以及执行的 XPath 查询。针对包含 xsd:type 的映射架构执行 XPath 查询时,XPath 使用在处理该查询时指定的数据类型。有关 XPath 如何使用 xsd:type 的详细信息,请参阅将 XSD 数据类型映射到 XPath 数据类型 (SQLXML 4.0)。
在返回的文档中,所有 SQL Server 数据类型都转换为字符串表示形式。某些数据类型需要其他转换。下表列出用于各种 xsd:type 值的转换。
XSD 数据类型 |
SQL Server 转换 |
---|---|
Boolean |
CONVERT(bit, COLUMN) |
Date |
LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10) |
decimal |
CONVERT(money, COLUMN) |
id/idref/idrefs |
id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
nmtoken/nmtokens |
id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
Time |
SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24) |
其他 |
无其他转换 |
注意 |
---|
SQL Server 返回的某些值可能与使用 xsd:type 指定的 XML 数据类型不兼容,这可能是由于无法转换(例如无法将 "XYZ" 转换为 decimal 数据类型),或是由于值超出了该数据类型的范围(例如,将 -100000 转换为 UnsignedShort XSD 类型)。不兼容的类型转换可能导致无效的 XML 文档或 SQL Server 错误。 |
从 SQL Server 数据类型映射到 XSD 数据类型
下表显示从 SQL Server 数据类型到 XSD 数据类型的显式映射。如果您知道 SQL Server 类型,此表将提供可以在 XSD 架构中指定的相应 XSD 类型。
SQL Server 数据类型 |
XSD 数据类型 |
---|---|
bigint |
long |
binary |
base64Binary |
bit |
boolean |
char |
string |
datetime |
dateTime |
decimal |
decimal |
float |
double |
image |
base64Binary |
int |
int |
money |
decimal |
nchar |
string |
ntext |
string |
nvarchar |
string |
numeric |
decimal |
real |
float |
smalldatetime |
dateTime |
smallint |
short |
smallmoney |
decimal |
sql_variant |
string |
sysname |
string |
text |
string |
timestamp |
dateTime |
tinyint |
unsignedByte |
varbinary |
base64Binary |
varchar |
string |
uniqueidentifier |
string |
sql:datatype 批注
sql:datatype 批注用于指定 SQL Server 数据类型;在以下情况下必须指定此批注:
正在从 XSD dateTime、date 或 time 类型大容量加载到 dateTimeSQL Server 列。在这种情况下,必须使用 sql:datatype="dateTime" 标识 SQL Server 列数据类型。此规则也适用于 updategram。
正在大容量加载到 SQL Serveruniqueidentifier 类型的列且 XSD 值是包含大括号({ 和 })的 GUID。指定 sql:datatype="uniqueidentifier" 时,在将值插入列之前从值中删除大括号。如果未指定 sql:datatype,将发送包含大括号的值并且插入或更新失败。
XML 数据类型 base64Binary 映射到各种 SQL Server 数据类型(binary、image 或 varbinary)。若要将 XML 数据类型 base64Binary 映射到特定的 SQL Server 数据类型,请使用 sql:datatype 批注。此批注指定属性要映射到的列的显式 SQL Server 数据类型。当正在数据库中存储数据时,这很有用。通过指定 sql:datatype 批注,可以标识显式 SQL Server 数据类型。
一般建议在架构中指定 sql:datatype。
示例
若要创建使用以下示例的工作示例,必须满足某些要求。有关详细信息,请参阅运行 SQLXML 示例的要求。
A. 指定 xsd:type
此示例显示在架构中使用 xsd:type 属性指定的 XSD date 类型如何影响生成的 XML 文档。该架构提供 AdventureWorks2008R2 数据库中 Sales.SalesOrderHeader 表的 XML 视图。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader">
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:string" />
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="OrderDate" type="xsd:date" />
<xsd:attribute name="DueDate" />
<xsd:attribute name="ShipDate" type="xsd:time" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
在该 XSD 架构中,有三个从 SQL Server 返回日期值的属性。当该架构:
为 OrderDate 属性指定 xsd:type=date 时,显示 SQL Server 为 OrderDate 属性返回的值的日期部分。
为 ShipDate 属性指定 xsd:type=time 时,显示 SQL Server 为 ShipDate 属性返回的值的时间部分。
不为 DueDate 属性指定 xsd:type 时,显示 SQL Server 所返回的相同值。
针对该架构测试示例 XPath 查询
复制上面的架构代码,并将它粘贴到文本文件中。将该文件另存为 xsdType.xml。
复制以下模板,并将它粘贴到文本文件中。在保存 xsdType.xml 的相同目录中将文件另存为 xsdTypeT.xml。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="xsdType.xml"> /Order </sql:xpath-query> </ROOT>
为映射架构 (xsdType.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:
mapping-schema="C:\SqlXmlTest\xsdType.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
下面是部分结果集:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43659"
CustomerID="676"
OrderDate="2005-07-01"
DueDate="2005-07-13T00:00:00"
ShipDate="00:00:00" />
<Order SalesOrderID="43660"
CustomerID="117"
OrderDate="2005-07-01"
DueDate="2005-07-13T00:00:00"
ShipDate="00:00:00" />
...
</ROOT>
以下是等效的 XDR 架构:
<?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="Sales.SalesOrderHeader">
<AttributeType name="SalesOrderID" />
<AttributeType name="CustomerID" />
<AttributeType name="OrderDate" dt:type="date" />
<AttributeType name="DueDate" />
<AttributeType name="ShipDate" dt:type="time" />
<attribute type="SalesOrderID" sql:field="OrderID" />
<attribute type="CustomerID" sql:field="CustomerID" />
<attribute type="OrderDate" sql:field="OrderDate" />
<attribute type="DueDate" sql:field="DueDate" />
<attribute type="ShipDate" sql:field="ShipDate" />
</ElementType>
</Schema>
B. 使用 sql:datatype 指定 SQL 数据类型
有关工作示例,请参阅 XML 大容量加载示例 (SQLXML 4.0) 中的示例 G。在此示例中,大容量加载包含“{”和“}”的 GUID 值。此示例中的架构指定 sql:datatype 以将 SQL Server 数据类型标识为 uniqueidentifier。此示例说明何时必须在架构中指定 sql:datatype。