共用方式為


資料類型轉換和 sql:datatype Annotation (SQLXML 4.0)

適用於:SQL ServerAzure SQL 資料庫

在 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、datetime 類型大量載入 dateTime SQL Server 資料行。 在此情況下,您必須使用 sql:datatype=“dateTime” 來識別 SQL Server 數據行數據類型。 此規則也適用於 updategram。

  • 您會大量載入 SQL Server uniqueidentifier 類型的數據行,而 XSD 值是包含大括弧 ({ 和 }) 的 GUID。 當您指定 sql:datatype=“uniqueidentifier”時,會將大括弧從值中移除,然後再插入數據行中。 如果未 指定 sql:datatype ,則會以大括弧傳送值,而插入或更新會失敗。

  • XML 數據類型 base64Binary 會對應至各種 SQL Server 數據類型(binaryimagevarbinary)。 若要將 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. 複製下列範本,並將它貼到文字檔中。 將檔案儲存為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 大量載入範例中的範例 G (SQLXML 4.0)。 在此範例中,會大量載入包含 “{” 和 “}” 的 GUID 值。 此範例中的架構會 指定 sql:datatype ,以將 SQL Server 數據類型識別為 uniqueidentifier。 此範例說明何時 必須在架構中指定 sql:datatype