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