次の方法で共有


データ型変換と sql:datatype 注釈 (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 クエリにも影響します。 XPath クエリが、 xsd:type を含むマッピング スキーマに対して実行されると、XPath はクエリの処理時に指定されたデータ型を使用します。 XPath での xsd:type の使用方法の詳細については、「 XSD データ型を XPath データ型にマップする (SQLXML 4.0)」を参照してください。

返されたドキュメントでは、すべての SQL Server データ型が文字列形式に変換されます。 また、データ型によっては追加の変換が必要です。 次の表に、さまざまな xsd:type 値に使用される変換の一覧を示します。

XSD データ型 SQL Server の変換
ブール値 CONVERT(ビット、列)
左(コンバート(nvarchar(4000)、列、126)、10)
10 進 CONVERT(マネー、カラム)
id/idref/idrefs id-prefix + CONVERT(nvarchar(4000), 列、126)
nmtoken/nmtokens id-prefix + CONVERT(nvarchar(4000), 列、126)
時刻 SUBSTRING(CONVERT(nvarchar(4000), 列、126)、1+CHARINDEX(N'T', CONVERT(nvarchar(4000), 列、126)), 24)
その他すべて 追加の変換はありません。

Note

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
[バイナリ] 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 dateTimedate、または time 型から dateTimeSQL Server 列に一括読み込みを行います。 この場合は、 sql:datatype="dateTime"を使用して、SQL Server 列のデータ型を識別する必要があります。 この規則はアップデートグラムにも当てはまります。

  • SQL Server uniqueidentifier 型の列に一括読み込みを行っており、XSD 値は中かっこ ({ と }) を含む GUID です。 sql:datatype="uniqueidentifier"を指定すると、列に挿入される前に中かっこが値から削除されます。 sql:datatype が指定されていない場合、値は中かっこで送信され、挿入または更新は失敗します。

  • XML データ型 base64Binary は、さまざまな SQL Server データ型 (binaryimage、または varbinary) にマップされます。 XML データ型 base64Binary を特定の SQL Server データ型にマップするには、 sql:datatype 注釈を使用します。 この注釈は、属性がマップされる列の明示的な SQL Server データ型を指定します。 これは、データをデータベースに格納する場合に便利で、 sql:datatype注釈を指定することで、明示的な SQL Server データ型を識別できます。

一般に、スキーマで sql:datatype を指定することをお勧めします。

次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。 詳細については、「REquirements for Running SQLXML Examples」を参照してください。

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 から日付値を返す 3 つの属性があります。 それぞれの属性は次のとおりです。

  • OrderDate 属性のxsd:type=dateを指定します。OrderDate 属性に対して SQL Server によって返される値の日付部分が表示されます。

  • ShipDate 属性のxsd:type=timeを指定します。ShipDate 属性に対して SQL Server によって返される値の時刻部分が表示されます。

  • 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 一括読み込みの例 (SQLXML 4.0)の例 G」を参照してください。 この例では、"{" および "}" を含む GUID 値の一括読み込みが行われます。 この例のスキーマでは、 sql:datatype を指定して、SQL Server データ型を uniqueidentifier として識別します。 この例では、スキーマで sql:datatype を指定する必要がある場合を示します。