次の方法で共有


データ型の強制型変換 (XDR スキーマ)

ms172725.note(ja-jp,SQL.90).gif重要 :
このトピックは、レガシ アプリケーションの参照用として用意されています。この機能は今後更新されません。新しい開発作業では、この機能の使用を避け、注釈付き XSD スキーマを使用して XML ビューを作成してください。詳細については、「注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。既存の注釈付き XDR スキーマは、XSD スキーマに変換できます。詳細については、「注釈付き XDR スキーマから同等の XSD スキーマへの変換 (SQLXML 4.0)」を参照してください。

XDR スキーマでは、要素または属性のデータ型を指定することができます。XDR スキーマを使用してデータベースからデータを抽出すると、クエリの結果として適切なデータ形式が出力されます。dt:type および sql:datatype 注釈は、XDR データ型と Microsoft SQL Server データ型の間のマッピングを制御するために使用します。

dt:type

dt:type 属性を使用すると、列にマップする属性や要素の XML データ型を指定できます。dt:type 属性は、<AttributeType> または <ElementType> で指定できます。dt:type はサーバーから返されるドキュメントだけでなく、実行される XPath クエリにも影響します。dt:type を含むマッピング スキーマに対して XPath クエリを実行すると、XPath でクエリが処理されるときに、指定されたデータ型が使用されます。XPath で dt:type がどのように使用されるかの詳細については、「XPath のデータ型 (SQLXML 4.0)」を参照してください。

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

XML データ型 SQL Server の変換

bit

CONVERT(bit, COLUMN)

date

LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)

fixed.14.4

CONVERT(money, COLUMN)

id/idref/idrefs

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

nmtoken/nmtokens

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

time/time.tz

SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)

他のすべて

追加の変換はありません。

SQL Server 値によっては、XML データに変換できない場合もあります。たとえば、"XYZ" は数値型に変換できない値であり、-100,000 は ui2 に変換するとデータ型の範囲を超える値となるためです。互換性のない型を変換しようとすると、無効な XML ドキュメントが生成されるか、SQL Server エラーになる可能性があります。

SQL Server データ型から XML データ型へのマッピング

次の表は、SQL Server データ型から XML データ型への通常のマッピングです。

SQL Server データ型 XML データ型

bigint

i8

binary

bin.base64

bit

boolean

char

char

datetime

datetime

decimal

r8

float

r8

image

bin.base64

int

int

money

r8

nchar

string

ntext

string

nvarchar

string

numeric

r8

real

r4

smalldatetime

datetime

smallint

i2

smallmoney

fixed.14.4

sysname

string

text

string

timestamp

ui8

tinyint

ui1

varbinary

bin.base64

varchar

string

uniqueidentifier

uuid

sql:datatype

XML データ型 bin.base64 は、さまざまな Microsoft SQL Server データ型 (binaryimage、または varbinary) にマップされます。XML データ型 bin.base64 を特定の SQL Server データに明示的にマップするには、sql:datatype 注釈を使用します。sql:datatype では、属性のマップ先列の SQL Server データ型を指定できます。

これは、データをデータベースに格納する場合に便利で、sql:datatype 注釈を指定することにより、SQL Server データ型を明示的に識別できます。データ アイテムは、sql:datatype で指定されたデータ型で格納されます。

sql:datatype 注釈では、すべての SQL Server 組み込みデータ型がサポートされています。ユーザー定義型やシノニムはサポートされていません。sql:datatype="nvarchar"sql:datatype="nchar(10)" のように、有効桁数および小数点以下桁数もサポートされています。

マッピング スキーマで XDR と SQL Server のデータ型を指定すると、SQL クエリでの不要なデータ変換を減らすことができます。たとえば、XPath では SQL Server データ型を XDR データ型に変換した後、その XDR 型を XPath 型に変換する必要がありますが、sql:datatype または XDR 型が指定されており、XPath で変換が不要であると判断されると、変換は実行されません。

主キー列の場合、このような変換を減らすことで、大幅なパフォーマンスの向上につながります。たとえば、次のクエリでは通常、正しい結果を保証するため CustomerID を文字列 (nvarchar) に変換する必要があります。

Customer[@CustomerID='ALFKI']

この場合、スキーマ内で CustomerID に sql:datatype="nvarchar" の注釈を指定すると、XPath では不要なデータ変換を回避できます。

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

A. 属性に dt:type を指定する

この XDR スキーマでは、OrdDate および ShipDate 属性に dt:type が指定されています。

ReqDate 属性には、XPath データ型は指定されていません。このため、XPath では、データベース内の RequiredDate 列から取得した SQL Server の datetime 値が返されます。

OrdDate 属性には、XPath の "date" データ型が指定されています。このため、XPath では、OrderDate 列から取得した値の日付の部分のみが返されます。時刻の部分は含まれません。

ShipDate 属性には、XPath の "time" データ型が指定されています。このため、XPath では、ShippedDate 列から取得した値の時刻の部分のみが返されます。日付の部分は含まれません。

<?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="Orders">
    <AttributeType name="OID" />
    <AttributeType name="CustID"  />
    <AttributeType name="OrdDate" dt:type="date" />
    <AttributeType name="ReqDate" />
    <AttributeType name="ShipDate" dt:type="time" />

    <attribute type="OID" sql:field="OrderID" />
    <attribute type="CustID" sql:field="CustomerID" />
    <attribute type="OrdDate" sql:field="OrderDate" />
    <attribute type="ReqDate" sql:field="RequiredDate" />
    <attribute type="ShipDate" sql:field="ShippedDate" />
</ElementType>
</Schema>

スキーマに対してサンプル XPath クエリをテストするには

  1. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、dataTypeXdr.xml として保存します。

  2. 次のテンプレートをコピーして、テキスト ファイルに貼り付け、dataTypeXdr.xml を保存したディレクトリに dataTypeXdrT.xml として保存します。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="dataTypeXdr.xml">
        /Order[@OID=43860]
      </sql:xpath-query>
    </ROOT>
    
  3. 次の URL でテンプレートが実行されます。

    http://IISServer/AdventureWorks/template/dataTypeXdrT.xml
    

次に結果セットを示します。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order OID="43860" CustID="1" OrdDate="2001-08-01" ReqDate="2001-08-13T00:00:00" ShipDate="00:00:00" /> 
</ROOT>

B. 属性に sql:datatype を指定する

この例では、sql:datatype を使用して、LargePhoto 列の SQL Server データ型が指定されています。

<?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="ProductPhoto" sql:relation="Production.ProductPhoto">
    <AttributeType name="PhotoID" />
    <AttributeType name="filename" />
    <AttributeType name="photo" sql:datatype="image"  />

    <attribute type="PhotoID" sql:field="ProductPhotoID" />
    <attribute type="filename" sql:field="LargePhotoFileName" />
    <attribute type="photo" sql:field="LargePhoto" />
</ElementType>
</Schema>

スキーマに対してサンプル XPath クエリをテストするには

  1. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、DataTypeXdr2.xml として保存します。

  2. 次のテンプレートをコピーして、テキスト ファイルに貼り付け、DataTypeXdr2.xml を保存したディレクトリに DataTypeXdr2T.xml として保存します。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="DataTypeXdr2.xml">
        /ProductPhoto[@PhotoID="100"]
      </sql:xpath-query>
    </ROOT>
    

    マッピング スキーマ (DataTypeXdr2.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。

    mapping-schema="C:\MyDir\DataTypeXdr2.xml"
    
  3. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

次に結果セットを示します。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
    <ProductPhoto PhotoID="100" filename="racer02_red_large.gif" 
 photo="Binary_base64_image_returned_here"/> 
</ROOT>

参照

関連項目

SQLXML 4.0 での XPath クエリの使用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手