数据类型转换和 sql:数据类型注释 (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 转换 |
---|---|
布尔 | CONVERT(bit, COLUMN) |
日期 | LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10) |
十进制 | CONVERT(money, COLUMN) |
id/idref/idrefs | id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
nmtoken/nmtokens | id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
时间 | SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24) |
所有其他 | 无其他转换 |
注意
SQL Server 返回的某些值可能与使用 xsd:type 指定的 XML 数据类型不兼容,因为转换是不可能(例如,将“XYZ”转换为 十进制 数据类型),或者因为该值超出了该数据类型的范围(例如-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 或时间类型批量加载到 dateTime SQL Server 列。 在这种情况下,必须使用 sql:datatype=“dateTime”标识 SQL Server 列数据类型。 此规则也适用于 updategram。
将批量加载到 SQL Server uniqueidentifier 类型的列中,XSD 值是包含大括号 ({ 和 }) 的 GUID。 指定 sql:datatype=“uniqueidentifier”时,大括号将从值中删除,然后再将其插入到列中。 如果未 指定 sql:datatype ,则使用大括号发送值,并且插入或更新失败。
XML 数据类型 base64Binary 映射到各种 SQL Server 数据类型(二进制、 图像或 varbinary)。 若要将 XML 数据类型 base64Binary 映射到特定的 SQL Server 数据类型,请使用 sql:datatype 注释。 此批注指定属性映射到的列的显式 SQL Server 数据类型。 当正在数据库中存储数据时,这很有用。 通过指定 sql:datatype 注释,可以标识显式 SQL Server 数据类型。
通常建议在架构中指定 sql:datatype 。
示例
若要创建使用以下示例的工作示例,必须满足某些要求。 有关详细信息,请参阅 运行 SQLXML 示例的要求。
A. 指定 xsd:type
此示例显示通过使用架构中的 xsd:type 属性指定的 XSD 日期类型如何影响生成的 XML 文档。 该架构提供 AdventureWorks 数据库中 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="2001-07-01"
DueDate="2001-07-13T00:00:00"
ShipDate="00:00:00" />
<Order SalesOrderID="43660"
CustomerID="117"
OrderDate="2001-07-01"
DueDate="2001-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 大容量加载示例中的示例 G(SQLXML 4.0)。 在此示例中,大容量加载包含“{”和“}”的 GUID 值。 此示例中的架构指定要将 SQL Server 数据类型标识为 uniqueidentifier 的 sql:datatype。 此示例演示 了如何在架构中指定 sql:datatype 。