数据类型转换和 sql:数据类型注释 (SQLXML 4.0)

适用于:SQL Server Azure SQL 数据库

在 XSD 架构中 ,xsd:type 属性指定元素或属性的 XSD 数据类型。 在 XSD 架构用于从数据库中提取数据时,指定的数据类型用于将数据格式化。

除了在架构中指定 XSD 类型外,还可以使用 sql:datatype 批注指定Microsoft SQL Server 数据类型。 xsd:typesql: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 查询
  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="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