資料類型轉換和 sql:datatype Annotation (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) |
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) |
All others | 沒有其他轉換 |
注意
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 Annotation
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 日期類型會影響產生的 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。
複製下列範本,並將它貼到文字檔中。 將檔案儲存為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"
建立並使用 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:datatype ,以將 SQL Server 數據類型識別為 uniqueidentifier。 此範例說明何時 必須在架構中指定 sql:datatype 。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應