Share via


XML アップデートグラムを使用した、データの挿入 (SQLXML 4.0)

アップデートグラムで、レコード インスタンスが <after> ブロックにあり、対応する <before> ブロックにない場合は、挿入操作であることを示します。この場合、アップデートグラムでは <after> ブロック内のレコードがデータベースに挿入されます。

挿入操作のアップデートグラムの形式は次のとおりです。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync [mapping-schema="SampleSchema.xml"]  >
   [<updg:before>
   </updg:before>]
    <updg:after [updg:returnid="x y ...] >
       <ElementName [updg:id="value"] 
                   [updg:at-identity="x"] 
                   [updg:guid="y"]
                   attribute="value" 
                   attribute="value"
                   ...
       />
      [<ElementName .../>... ]
    </updg:after>
  </updg:sync>
</ROOT>

&lt;before&gt; ブロック

<before> ブロックは挿入操作では省略できます。オプションの mapping-schema 属性を省略すると、アップデートグラムで指定される <ElementName> はデータベース テーブルにマップされ、子要素または属性はテーブル内の列にマップされます。

&lt;after&gt; ブロック

<after> ブロックには 1 つ以上のレコードを指定できます。

特定の列に対し、<after> ブロックで値が指定されない場合、アップデートグラムでは注釈付きスキーマで指定されている既定値が使用されます (スキーマが指定されている場合)。スキーマで、列に対する既定値が指定されていない場合、アップデートグラムではこの列に明示的な値は指定されず、Microsoft SQL Server の既定値がある場合は代わりにその値が列に割り当てられます。SQL Server の既定値がなく、列で NULL 値が許容される場合、アップデートグラムでは列値に NULL が設定されます。列に既定値がなく NULL 値が許容されない場合、コマンドは失敗し、アップデートグラムではエラーが返されます。updg:returnid 属性は省略可能です。この属性は、IDENTITY 型の列があるテーブルにレコードを追加するときに、システムによって生成される ID 値を返す場合に使用します。

updg:id 属性

アップデートグラムでレコードのみを挿入する場合、アップデートグラムに updg:id 属性を指定する必要はありません。updg:id の詳細については、「XML アップデートグラムを使用した、データの更新 (SQLXML 4.0)」を参照してください。

updg:at-identity 属性

アップデートグラムで、IDENTITY 型列があるテーブルにレコードを挿入するときには、省略可能な updg:at-identity 属性を使用して、システムにより割り当てられた値をキャプチャできます。キャプチャした値は、後続のアップデートグラム操作で使用できます。updg:returnid 属性を指定してアップデートグラムを実行すると、生成される ID 値を返すことができます。

updg:guid 属性

updg:guid 属性は省略可能です。この属性では、グローバル一意識別子が生成されます。この値は、この属性が指定されている <sync> ブロック全体のスコープ内に残り、<sync> ブロック内のどこでも使用できます。この属性では、NEWGUID() SQL Server 関数を呼び出すことにより一意な識別子が生成されます。

次の例を使用した実際のサンプルを作成するには、「SQLXML のサンプル実行のための必要条件」で指定される条件を満たす必要があります。

アップデートグラムの例を使用する前に、次のことに注意してください。

A. アップデートグラムを使用してレコードを挿入する

この属性中心のアップデートグラムでは、AdventureWorks データベース内の HumanResources.Employee テーブルにレコードを挿入します。

この例のアップデートグラムでは、マッピング スキーマを指定しません。したがって、アップデートグラムでは既定のマッピングが使用されます。このマッピングでは、要素名はテーブル名にマップされ、属性または子要素はそのテーブル内の列にマップされます。

HumanResources.Employee テーブルに対する AdventureWorks スキーマでは、ManagerID と EmployeeID を除くすべての列に 'not null' 制限が設定されます。したがって、アップデートグラムには、これらの 2 つの列以外のすべての列に指定する値を含める必要があります。ManagerID は省略し、アップデートグラムの実行時、この値は NULL になります。EmployeeID は IDENTITY 型の列であり、値は指定しません。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
    </updg:before>
    <updg:after>
       <HumanResources.Employee 
            NationalIDNumber="111111111" 
            ContactID="1156" 
            LoginID="adventure-works\paulw0"
            DepartmentID="7" 
            ShiftID="3" 
            Title="Production Technician - WC40"
            EmergencyContactID="1445" 
            AddressID="157"   
            BirthDate="1970-12-15 00:00:00.000"
            MaritalStatus="S" 
            Gender="M" 
            HireDate="1999-01-05 00:00:00.000"
            SalariedFlag="0" 
            BaseRate="15.00"
            PayFrequency="1" 
            VacationHours="80" 
            SickLeaveHours="80" 
            CurrentFlag="1" 
            rowguid="00001111-2222-3333-4444-555566667777"
            ModifiedDate="1998-12-29 00:00:00.000"/>
    </updg:after>
  </updg:sync>
</ROOT>

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

  1. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、MyUpdategram.xml として保存します。

  2. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

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

要素中心のマッピングの場合、アップデートグラムは次のようになります。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
    </updg:before>
    <updg:after>
       <HumanResources.Employee>
            <NationalIDNumber>111111111</NationalIDNumber>
            <ContactID>1156</ContactID>
            <LoginID>adventure-works\paulw0</LoginID>
            <DepartmentID>7</DepartmentID>
            <ShiftID>3</ShiftID>
            <Title>Production Technician - WC40</Title>
            <EmergencyContactID>1445</EmergencyContactID>
            <AddressID>157</AddressID>
            <BirthDate>1970-12-15 00:00:00.000</BirthDate>
            <MaritalStatus>S</MaritalStatus>
            <Gender>M</Gender>
            <HireDate>1999-01-05 00:00:00.000</HireDate>
            <SalariedFlag>0</SalariedFlag>
            <BaseRate>15.00</BaseRate>
            <PayFrequency>1</PayFrequency>
            <VacationHours>80</VacationHours>
            <SickLeaveHours>80</SickLeaveHours>
            <CurrentFlag>1</CurrentFlag>
            <rowguid>00001111-2222-3333-4444-555566667777</rowguid>
            <ModifiedDate>1998-12-29 00:00:00.000</ModifiedDate>
       </HumanResources.Employee>
    </updg:after>
  </updg:sync>
</ROOT>

要素中心と属性中心の混合モードのアップデートグラムでは、次のアップデートグラムのように、要素に属性と副要素の両方を含めることができます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
    </updg:before>
    <updg:after>
       <HumanResources.Employee 
            NationalIDNumber="111111111" 
            ContactID="1156" 
            DepartmentID="7" 
            ShiftID="3" 
            EmergencyContactID="1445" 
            AddressID="157"   
            SalariedFlag="0" 
            BaseRate="15.00"
            PayFrequency="1" 
            VacationHours="80" 
            SickLeaveHours="80" 
            CurrentFlag="1">
            <LoginID>adventure-works\paulw0</LoginID>
            <Title>Production Technician - WC40</Title>
            <BirthDate>1970-12-15 00:00:00.000</BirthDate>
            <HireDate>1999-01-05 00:00:00.000</HireDate>
            <MaritalStatus>S</MaritalStatus>
            <Gender>M</Gender>
            <rowguid>00001111-2222-3333-4444-555566667777</rowguid>
            <ModifiedDate>1998-12-29 00:00:00.000</ModifiedDate>
       </HumanResources.Employee>
    </updg:after>
  </updg:sync>
</ROOT>

B. アップデートグラムを使用して複数のレコードを挿入する

このアップデートグラムでは、HumanResources.Shift テーブルに 2 つの新しい勤務時間レコードを追加します。このアップデートグラムでは <before> ブロックは省略します。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:after >
       <HumanResources.Shift Name="Day-Evening"
                        StartTime="1900-01-01 11:00:00.000"
                        EndTime="1900-01-01 19:00:00.000"
                        ModifiedDate="2004-01-01 00:00:00.000" />
       <HumanResources.Shift Name="Evening-Night"
                        StartTime="1900-01-01 19:00:00.000"
                        EndTime="1900-01-01 03:00:00.000"
                        ModifiedDate="2004-01-01 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

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

  1. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、Updategram-AddShifts.xml として保存します。

  2. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

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

この例の別バージョンとして、アップデートグラムで 2 人の従業員を挿入するため、1 つではなく 2 つの <after> ブロックを個別に使用する方法もあります。これは有効であり、次のようにエンコードできます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:after >
       <HumanResources.Shift Name="Day-Evening"
                        StartTime="1900-01-01 11:00:00.000"
                        EndTime="1900-01-01 19:00:00.000"
                        ModifiedDate="2004-01-01 00:00:00.000" />
    </updg:after>
    <updg:before>
    </updg:before>
    <updg:after >
       <HumanResources.Shift Name="Evening-Night"
                        StartTime="1900-01-01 19:00:00.000"
                        EndTime="1900-01-01 03:00:00.000"
                        ModifiedDate="2004-01-01 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

C. SQL Server で有効で、XML では有効でない文字を処理する

SQL Server では、テーブル名は、Northwind データベースの Order Details テーブルのようにスペースを含めて指定できます。ただし、これは SQL Server 識別子として有効であっても XML 識別子としては有効ではありません。有効な XML 文字にするには、エンコード値 '__xHHHH__' を使用してエンコードします。この HHHH は、その文字の 16 進数 UCS-2 コードの 4 桁を最上位ビットから順に表したものです。

ms171764.note(ja-jp,SQL.90).gifメモ :
この例では Northwind データベースを使用します。これは SQL Server 2000 で最初にサンプル データベースとして提供されていましたが、SQL Server 2005 では提供されていません。この例を作成するには、SQL スクリプトをダウンロードして、SQL Server 2005 に Northwind データベースをインストールしてください。詳細については、「Northwind サンプル データベースと pubs サンプル データベースのダウンロード」を参照してください。

要素名も、角かっこ ([ ]) で囲む必要があります。文字 [ および ] は XML では有効ではないので、それぞれ _x005B_ および _x005D_ としてエンコードする必要があります。マッピング スキーマを使用して、空白文字など有効でない文字を含まない要素名を指定することもできます。この場合、マッピング スキーマで必要なマッピングが行われるので、これらの文字をエンコードする必要はありません。

次のアップデートグラムでは、Northwind データベースの Order Detais テーブルにレコードを追加します。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
    </updg:before>
    <updg:after>
      <_x005B_Order_x0020_Details_x005D_ OrderID="1"
            ProductID="11"
            UnitPrice="$1.0"
            Quantity="1"
            Discount="0.0" />
    </updg:after>
  </updg:sync>
</ROOT>

Order Details テーブル内の UnitPrice 列は money 型です。string 型から money 型へ、適切な型変換を行うには、ドル記号 ($) を値の一部に追加する必要があります。アップデートグラムでマッピング スキーマが指定されていない場合は、string 値の最初の文字が評価されます。最初の文字がドル記号 ($) の場合、適切な変換が行われます。

アップデートグラムで指定したマッピング スキーマで、列が dt:type="fixed.14.4" または sql:datatype="money" として適切にマークされている場合は、ドル記号 ($) は必要なく、マッピングによって変換が処理されます。適切な型変換が行われるようにするには、この方法が推奨されます。

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

  1. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、UpdategramSpacesInTableName.xml として保存します。

  2. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

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

D. at-identity 属性を使用して、IDENTITY 型の列に挿入されている値を取得する

次のアップデートグラムでは、Sales.SalesOrderHeader テーブルと Sales.SalesOrderDetail テーブルに 1 つずつ、合計 2 つのレコードを挿入します。

このアップデートグラムでは、最初にレコードを Sales.SalesOrderHeader テーブルに追加します。このテーブルで、SalesOrderID 列は IDENTITY 型の列です。したがって、このレコードをテーブルに追加するとき、アップデートグラムでは割り当てられている SalesOrderID 値を at-identity 属性に "x" (プレースホルダ値) としてキャプチャし、この at-identity 変数を <Sales.SalesOrderDetail> 要素の SalesOrderID 属性の値として指定します。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
 <updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
   <Sales.SalesOrderHeader updg:at-identity="x" 
             RevisionNumber="1"
             OrderDate="2001-07-01 00:00:00.000"
             DueDate="2001-07-13 00:00:00.000"
             OnlineOrderFlag="0"
             CustomerID="676"
             ContactID="378"
             BillToAddressID="985"
             ShipToAddressID="985"
             ShipMethodID="5"
             SubTotal="24643.9362"
             TaxAmt="1971.5149"
             Freight="616.0984"
             rowguid="00001111-2222-3333-4444-556677889900"
             ModifiedDate="2001-07-08 00:00:00.000" />
      <Sales.SalesOrderDetail SalesOrderID="x"
                LineNumber="1"
                OrderQty="1"
                ProductID="776"
                SpecialOfferID="1"
                UnitPrice="2429.9928"
                UnitPriceDiscount="0.00"
                rowguid="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
                ModifiedDate="2001-07-01 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

updg:at-identity 属性により生成される ID 値を返す場合は、updg:returnid 属性を使用できます。次のアップデートグラムは、この ID 値を返すように変更されたものです。例を少し複雑にするため、ここでは 2 つの注文レコードと 2 つの注文詳細レコードを追加します。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
 <updg:sync>
  <updg:before>
  </updg:before>
  <updg:after updg:returnid="x y" >
       <HumanResources.Shift updg:at-identity="x" Name="Day-Evening"
                        StartTime="1900-01-01 11:00:00.000"
                        EndTime="1900-01-01 19:00:00.000"
                        ModifiedDate="2004-01-01 00:00:00.000" />
       <HumanResources.Shift updg:at-identity="y" Name="Evening-Night"
                        StartTime="1900-01-01 19:00:00.000"
                        EndTime="1900-01-01 03:00:00.000"
                        ModifiedDate="2004-01-01 00:00:00.000" />
  </updg:after>
 </updg:sync>
</ROOT>

アップデートグラムを実行すると、次のような結果が返されます。この結果には、生成された ID 値 (テーブル ID に使用される ShiftID 列の生成値) が含まれます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> 
  <returnid> 
    <x>4</x> 
    <y>5</y> 
  </returnid> 
</ROOT>

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

  1. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、Updategram-returnId.xml として保存します。

  2. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

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

E. updg:guid 属性を使用して一意な値を生成する

この例のアップデートグラムでは、Cust および CustOrder テーブルにレコードを挿入します。また、updg:guid 属性を使用して、CustomerID 属性に一意な値を生成します。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
    </updg:before>
    <updg:after updg:returnid="x" >
      <Cust updg:guid="x" >
         <CustID>x</CustID>
         <LastName>Fuller</LastName>
      </Cust>
      <CustOrder>
         <CustID>x</CustID>
         <OrderID>1</OrderID>
      </CustOrder>
    </updg:after>
  </updg:sync>
</ROOT>

このアップデートグラムでは、returnid 属性を指定しています。結果として、生成された GUID が返されます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <returnid>
    <x>7111BD1A-7F0B-4CEE-B411-260DADFEFA2A</x> 
  </returnid>
</ROOT>

アップデートグラムをテストするには

  1. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、Updategram-GenerateGuid.xml として保存します。

  2. 次のテーブルを作成します。

    USE tempdb
    CREATE TABLE Cust (CustID uniqueidentifier, LastName varchar(20))
    CREATE TABLE CustOrder (CustID uniqueidentifier, OrderID int)
    
  3. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

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

F. アップデートグラムでスキーマを指定する

この例のアップデートグラムでは、レコードを次のテーブルに挿入します。

CustOrder(OrderID, EmployeeID, OrderType)

このアップデートグラムでは XSD スキーマを指定しています。アップデートグラム要素と属性に既定のマッピングはありません。このスキーマでは、要素および属性からデータベース テーブルおよび列への必要なマッピングが提供されます。

次のスキーマ (CustOrderSchema.xml) では、<CustOrder> 要素と、OrderID および EmployeeID 属性が指定されています。さらに、EmployeeID 属性には既定値が割り当てられています。アップデートグラムでは、属性の既定値は、アップデートグラムでその属性が指定されていない挿入操作のみに使用されます。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="CustOrder" >
   <xsd:complexType>
        <xsd:attribute name="OrderID"     type="xsd:integer" /> 
        <xsd:attribute name="EmployeeID"  type="xsd:integer" />
        <xsd:attribute name="OrderType  " type="xsd:integer" default="1"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

このアップデートグラムでは、CustOrder テーブルにレコードを挿入します。このアップデートグラムでは OrderID および EmployeeID 属性の値のみを指定し、OrderType 属性の値は指定しません。したがって、アップデートグラムでは、前のスキーマで指定されている EmployeeID 属性の既定値が使用されます。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"
             xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema='CustOrderSchema.xml'>
<updg:after>
       <CustOrder OrderID="98000" EmployeeID="1" />
</updg:after>
</updg:sync>
</ROOT>

マッピング スキーマを指定するアップデートグラムのその他の例については、「アップデートグラムでの注釈付きマッピング スキーマの指定 (SQLXML 4.0)」を参照してください。

アップデートグラムをテストするには

  1. tempdb データベース内に次のテーブルを作成します。

    USE tempdb
    CREATE TABLE CustOrder(
                     OrderID int, 
                     EmployeeID int, 
                     OrderType int)
    
  2. 上のスキーマをコピーして、テキスト ファイルに貼り付け、CustOrderSchema.xml として保存します。

  3. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、上の手順と同じフォルダに CustOrderUpdategram.xml として保存します。

  4. SQLXML 4.0 テスト スクリプト (Sqlxml4test.vbs) を作成し、それを使用してアップデートグラムを実行します。

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

XDR スキーマの場合は次のようになります。

<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
 <ElementType name="CustOrder" >
    <AttributeType name="OrderID" />
    <AttributeType name="EmployeeID" />
    <AttributeType name="OrderType" default="1" />
    <attribute type="OrderID"  />
    <attribute type="EmployeeID" />
    <attribute type="OrderType" />
  </ElementType>
</Schema>

G. xsi:nil 属性を使用して列に null 値を挿入する

テーブル内の列に null 値を挿入する場合は、アップデートグラム内の対応する要素に xsi:nil 属性を指定します。また、対応する XSD スキーマで、XSD nillable 属性も指定する必要があります。

たとえば、次の XSD スキーマを考えてみます。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Student" sql:relation="Students">
  <xsd:complexType>
    <xsd:all>
      <xsd:element name="fname" sql:field="first_name" 
                                type="xsd:string" 
                                 nillable="true"/>
    </xsd:all>
    <xsd:attribute name="SID" 
                        sql:field="StudentID"
                        type="xsd:ID"/>    
    <xsd:attribute name="lname"     
                        sql:field="last_name"
                        type="xsd:string"/>
    <xsd:attribute name="minitial"  
                        sql:field="middle_initial" 
                        type="xsd:string"/>
    <xsd:attribute name="years"     
                         sql:field="no_of_years"
                         type="xsd:integer"/>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>

この XSD スキーマでは、<fname> 要素に nillable="true" を指定しています。このスキーマを使用するアップデートグラムは次のとおりです。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"
      xmlns:updg="urn:schemas-microsoft-com:xml-updategram"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<updg:sync mapping-schema='StudentSchema.xml'>
  <updg:before/>
  <updg:after>
    <Student SID="S00004" lname="Elmaci" minitial="" years="2">
      <fname xsi:nil="true">
    </fname>
    </Student>
  </updg:after>
</updg:sync>

</ROOT>

このアップデートグラムでは、<after> ブロック内の <fname> 要素に xsi:nil を指定しています。したがって、このアップデートグラムを実行すると、テーブルの first_name 列に NULL 値が挿入されます。

アップデートグラムをテストするには

  1. tempdb データベース内に次のテーブルを作成します。

    USE tempdb
    CREATE TABLE Students (
       StudentID char(6)NOT NULL ,
       first_name varchar(50),
       last_name varchar(50),
       middle_initial char(1),
       no_of_years int NULL)
    GO
    
  2. 上のスキーマをコピーして、テキスト ファイルに貼り付け、StudentSchema.xml として保存します。

  3. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、上の手順の StudentSchema.xml と同じフォルダに StudentUpdategram.xml として保存します。

  4. SQLXML 4.0 テスト スクリプト (Sqlxml4test.vbs) を作成し、それを使用してアップデートグラムを実行します。

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

H. アップデートグラムで名前空間を指定する

アップデートグラム内の要素で名前空間を宣言し、その名前空間に属する要素として、同じ要素を保持することができます。この場合、対応するスキーマで同じ名前空間を宣言する必要があり、対象の名前空間に要素が属している必要があります。

たとえば、次のアップデートグラム (UpdateGram-ElementHavingNamespace.xml) では、<Order> 要素で名前空間が宣言されており、その名前空間に要素が属しています。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync mapping-schema='XSD-ElementHavingNameSpace.xml'>
    <updg:after>
       <x:Order  xmlns:x="https://server/xyz/schemas/"
             updg:at-identity="SalesOrderID" 
             RevisionNumber="1"
             OrderDate="2001-07-01 00:00:00.000"
             DueDate="2001-07-13 00:00:00.000"
             OnlineOrderFlag="0"
             CustomerID="676"
             ContactID="378"
             BillToAddressID="985"
             ShipToAddressID="985"
             ShipMethodID="5"
             SubTotal="24643.9362"
             TaxAmt="1971.5149"
             Freight="616.0984"
             rowguid="00009999-8888-7777-6666-554433221100"
             ModifiedDate="2001-07-08 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

この場合、このスキーマに示すように、スキーマでも名前空間を宣言する必要があります。

次のスキーマ (XSD-ElementHavingNamespace.xml) では、対応する要素と属性の宣言方法を示しています。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:dt="urn:schemas-microsoft-com:datatypes" 
     xmlns:sql="urn:schemas-microsoft-com:mapping-schema"  
     xmlns:x="https://server/xyz/schemas/" 
     targetNamespace="https://server/xyz/schemas/" >
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" type="x:Order_type"/>
  <xsd:complexType name="Order_type">
    <xsd:attribute name="SalesOrderID"  type="xsd:ID"/>
    <xsd:attribute name="RevisionNumber" type="xsd:unsignedByte"/>
    <xsd:attribute name="OrderDate" type="xsd:dateTime"/>
    <xsd:attribute name="DueDate" type="xsd:dateTime"/>
    <xsd:attribute name="ShipDate" type="xsd:dateTime"/>
    <xsd:attribute name="Status" type="xsd:unsignedByte"/>
    <xsd:attribute name="OnlineOrderFlag" type="xsd:boolean"/>
    <xsd:attribute name="SalesOrderNumber" type="xsd:string"/>
    <xsd:attribute name="PurchaseOrderNumber" type="xsd:string"/>
    <xsd:attribute name="AccountNumber" type="xsd:string"/>
    <xsd:attribute name="CustomerID" type="xsd:int"/>
    <xsd:attribute name="ContactID" type="xsd:int"/>
    <xsd:attribute name="SalesPersonID" type="xsd:int"/>
    <xsd:attribute name="TerritoryID" type="xsd:int"/>
    <xsd:attribute name="BillToAddressID" type="xsd:int"/>
    <xsd:attribute name="ShipToAddressID" type="xsd:int"/>
    <xsd:attribute name="ShipMethodID" type="xsd:int"/>
    <xsd:attribute name="CreditCardID" type="xsd:int"/>
    <xsd:attribute name="CreditCardApprovalCode" type="xsd:string"/>
    <xsd:attribute name="CurrencyRateID" type="xsd:int"/>
    <xsd:attribute name="SubTotal" type="xsd:decimal"/>
    <xsd:attribute name="TaxAmt" type="xsd:decimal"/>
    <xsd:attribute name="Freight" type="xsd:decimal"/>
    <xsd:attribute name="TotalDue" type="xsd:decimal"/>
    <xsd:attribute name="Comment" type="xsd:string"/>
    <xsd:attribute name="rowguid" type="xsd:string"/>
    <xsd:attribute name="ModifiedDate" type="xsd:dateTime"/>
  </xsd:complexType>
</xsd:schema>

アップデートグラムをテストするには

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

  2. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、XSD-ElementHavingnamespace.xml と同じフォルダに Updategram-ElementHavingNamespace.xml として保存します。

  3. SQLXML 4.0 テスト スクリプト (Sqlxml4test.vbs) を作成し、それを使用してアップデートグラムを実行します。

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

I. XML データ型列にデータを挿入する

xml データ型は、新しく SQL Server 2005 で導入されたデータ型です。アップデートグラムを使用して、xml データ型の列にデータを挿入したり、この列に格納されているデータを更新することができます。これには次の条件があります。

  • xml 列は、既存の行の識別に使用できません。したがって、アップデートグラムの updg:before セクションに含めることはできません。
  • xml 列に挿入される XML フラグメントのスコープにある名前空間は保持されます。挿入されたフラグメントの最上位要素には、その名前空間宣言が追加されます。

たとえば、次のアップデートグラム (SampleUpdateGram.xml) では、<Desc> 要素によって、AdventureWorks サンプル データベース内の Production>productModel テーブルにある ProductDescription 列が更新されます。このアップデートグラムを実行すると、ProductDescription 列の XML コンテンツが、<Desc> 要素の XML コンテンツに更新されます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
    <updg:sync mapping-schema="SampleSchema.xml" >
       <updg:before>
<ProductModel ProductModelID="19">
   <Name>Mountain-100</Name>
</ProductModel>
    </updg:before>
    <updg:after>
 <ProductModel>
    <Name>Mountain-100</Name>
    <Desc><?xml-stylesheet href="ProductDescription.xsl" type="text/xsl"?>
        <p1:ProductDescription xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription" 
              xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain" 
              xmlns:wf="https://www.adventure-works.com/schemas/OtherFeatures" 
              xmlns:html="http://www.w3.org/1999/xhtml" 
              >
  <p1:Summary>
     <html:p>Insert Example</html:p>
  </p1:Summary>
  <p1:Manufacturer>
    <p1:Name>AdventureWorks</p1:Name>
    <p1:Copyright>2002</p1:Copyright>
    <p1:ProductURL>HTTP://www.Adventure-works.com</p1:ProductURL>
  </p1:Manufacturer>
  <p1:Features>These are the product highlights. 
    <wm:Warranty>
       <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
       <wm:Description>parts and labor</wm:Description>
    </wm:Warranty>
    <wm:Maintenance>
       <wm:NoOfYears>10 years</wm:NoOfYears>
       <wm:Description>maintenance contract available through your dealer or any AdventureWorks retail store.</wm:Description>
    </wm:Maintenance>
    <wf:wheel>High performance wheels.</wf:wheel>
    <wf:saddle>
      <html:i>Anatomic design</html:i> and made from durable leather for a full-day of riding in comfort.</wf:saddle>
    <wf:pedal>
       <html:b>Top-of-the-line</html:b> clipless pedals with adjustable tension.</wf:pedal>
    <wf:BikeFrame>Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.</wf:BikeFrame>
    <wf:crankset> Triple crankset; alumunim crank arm; flawless shifting. </wf:crankset>
   </p1:Features>
   <p1:Picture>
      <p1:Angle>front</p1:Angle>
      <p1:Size>small</p1:Size>
      <p1:ProductPhotoID>118</p1:ProductPhotoID>
   </p1:Picture>
   <p1:Specifications> These are the product specifications.
     <Material>Almuminum Alloy</Material>
     <Color>Available in most colors</Color>
     <ProductLine>Mountain bike</ProductLine>
     <Style>Unisex</Style>
     <RiderExperience>Advanced to Professional riders</RiderExperience>
   </p1:Specifications>
  </p1:ProductDescription>
 </Desc>
      </ProductModel>
    </updg:after>
  </updg:sync>
</ROOT>

このアップデートグラムでは、次の注釈付き XSD スキーマ (SampleSchema.xml) を参照しています。

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
           xmlns="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"> 
  <xsd:element name="ProductModel"  sql:relation="Production.ProductModel" >
     <xsd:complexType>
       <xsd:sequence>
          <xsd:element name="Name" type="xsd:string"></xsd:element>
          <xsd:element name="Desc" sql:field="CatalogDescription" sql:datatype="xml">
           <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="ProductDescription">
                 <xsd:complexType>
                   <xsd:sequence>
                     <xsd:element name="Summary" type="xsd:anyType">
                     </xsd:element>
                   </xsd:sequence>
                 </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
           </xsd:complexType>
          </xsd:element> 
       </xsd:sequence>
       <xsd:attribute name="ProductModelID" sql:field="ProductModelID"/>
     </xsd:complexType>
  </xsd:element>
</xsd:schema>

アップデートグラムをテストするには

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

    ms171764.note(ja-jp,SQL.90).gifメモ :
    アップデートグラムでは既定のマッピングがサポートされるので、xml データ型の開始位置と終了位置を識別する方法はありません。つまり、xml データ型の列を含むテーブルを挿入または更新するときには、マッピング スキーマが必要です。スキーマを指定しない場合、SQLXML では、テーブル内の列の 1 つが見つからないというエラーが返されます。
  2. 上のアップデートグラムをコピーして、テキスト ファイルに貼り付け、SampleSchema.xml と同じフォルダに SampleUpdategram.xml として保存します。

  3. SQLXML 4.0 テスト スクリプト (Sqlxml4test.vbs) を作成し、それを使用してアップデートグラムを実行します。

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

参照

関連項目

アップデートグラムのセキュリティに関する注意点 (SQLXML 4.0)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手