データ型の強制型変換 (XDR スキーマ)
重要 : |
---|
このトピックは、レガシ アプリケーションの参照用として用意されています。この機能は今後更新されません。新しい開発作業では、この機能の使用を避け、注釈付き 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 データ型 (binary、image、または 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 クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、dataTypeXdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、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>
次の 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 クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、DataTypeXdr2.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、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"
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>