データ型の強制型変換と sql:datatype 注釈 [SQLXML 4.0]
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 の変換 |
---|---|
Boolean |
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) |
他のすべて |
追加の変換はありません。 |
メモ : |
---|
SQL Server から、xsd:type で指定される XML データ型と互換性のない値が返される場合もあります。たとえば、"XYZ" は decimal データ型に変換できない値であり、-100,000 は 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 型から SQL Server dateTime 列に一括読み込みを行う場合。この場合、sql:datatype="dateTime" を使って SQL Server 列のデータ型を指定する必要があります。この規則はアップデートグラムにも当てはまります。
- 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 から日付値を返す 3 つの属性が含まれています。それぞれの属性は次のとおりです。
- OrderDate 属性。xsd:type=date が指定されており、OrderDate 属性に対して SQL Server から返される値の日付部分が表示されます。
- ShipDate 属性。xsd:type=time が指定されており、ShipDate 属性に対して SQL Server から返される値の時間部分が表示されます。
- DueDate 属性。xsd:type が指定されておらず、SQL Server から返される値がそのまま表示されます。
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、xsdType.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、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"
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 を指定する必要があるかを示すものです。