次の方法で共有


データ型の強制型変換と 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)

日付

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 クエリをテストするには

  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 を指定する必要があるかを示すものです。