数据类型强制和 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 文档。该架构提供 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 大容量加载示例 (SQLXML 4.0) 中的示例 G。在此示例中,大容量加载包含“{”和“}”的 GUID 值。此示例中的架构指定 sql:datatype 以将 SQL Server 数据类型标识为 uniqueidentifier。此示例说明何时必须在架构中指定 sql:datatype。
注意