共用方式為


資料類型強制型轉和 sql:datatype 註解 (SQLXML 4.0)

在 XSD 結構描述中,xsd:type 屬性會指定元素或屬性的 XSD 資料類型。 當 XSD 結構描述用於從資料庫擷取資料時,指定的資料類型則會用於將資料格式化。

除了在結構描述中指定 XSD 類型,您也可以藉由使用 sql:datatype 註解指定 Microsoft SQL Server 資料類型。 在 XSD 資料類型和 SQL Server 資料類型之間,xsd:type 和 sql:datatype 屬性會控制對應。

xsd:type 屬性

您可以使用 xsd:type 屬性指定屬性或元素之 XML 資料類型,而該屬性或元素是對應到資料行的。 xsd:type 會影響從伺服器傳回的文件,以及已執行的 XPath 查詢。 當 XPath 查詢針對包含 xsd:type 的對應結構描述執行時,XPath 則會在處理查詢的同時使用指定的資料類型。 如需有關 XPath 如何使用 xsd:type 的詳細資訊,請參閱<將 XSD 資料類型對應到 XPath 資料類型 (SQLXML 4.0)。>

在傳回的文件中,所有 SQL Server 資料類型會轉換為字串表示。 某些資料類型需要額外的轉換。 下表列出用於各種 xsd:type 值的轉換。

XSD 資料類型

SQL Server 轉換

Boolean

CONVERT(bit, COLUMN)

日期

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)

All others

No additional conversion

[!附註]

某些由 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 類型大量載入到 dateTime SQL Server 資料行。 在這個狀況下,您必須藉由使用 sql:datatype="dateTime" 指定 SQL Server 資料行資料類型。 這項規則也套用於 Updategram。

  • 您大量載入到 SQL Server uniqueidentifier 類型的資料行,而且 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 時,會顯示由 OrderDate 屬性的 SQL Server 所傳回之值的日期部分。

  • 指定 ShipDate 屬性的 xsd:type=time 時,會顯示由 ShipDate 屬性的 SQL Server 所傳回之值的時間部分。

  • 未指定 DueDate 屬性的 xsd:type 時,會顯示由 SQL Server 傳回之相同值。

針對結構描述測試範例 XPath 查詢

  1. 複製上述的結構描述程式碼,並將其貼到文字檔中。 將檔案儲存為 xsdType.xml。

  2. 複製下列範本,並將其貼到文字檔中。 將檔案儲存為 xsdTypeT.xml 並放在與 xsdType.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 大量載入範例 (SQLXML 4.0) 中的<範例 G>。 在這個範例中,包含 "{" 和 "}" 的 GUID 值是大量載入的。 在這個範例中的結構描述會指定 sql:datatype 將 SQL Server 資料類型識別為 uniqueidentifier。 這個範例會說明在結構描述中什麼時候必須指定 sql:datatype。