数据类型强制和 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 查询

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

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 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"
    
  3. 创建并使用 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。