共用方式為


使用 XML Updategram 插入資料 (SQLXML 4.0)

當記錄執行個體出現在 <after> 區塊,但未出現在對應的 <before> 區塊時,Updategram 代表插入作業。在這種情況下,Updategram 會將 <after> 區塊中的記錄插入至資料庫。

下列是插入作業的 Updategram 格式:

<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 屬性,則 Updategram 中指定的 <ElementName> 會對應到資料庫資料表,而子元素或屬性則會對應到資料表中的資料行。

&lt;after&gt; 區塊

您可以在 <after> 區塊中指定一或多筆記錄。

如果 <after> 區塊沒有為特定的資料行提供値,則 Updategram 會使用在註解結構描述中指定的預設值 (如果已指定結構描述)。如果結構描述沒有為該資料行指定預設值,則 Updategram 不會為此資料行指定任何明確的値,而會將 MicrosoftSQL Server 預設值 (若有指定) 指派給此資料行。如果沒有 SQL Server 預設值,而資料行接受 NULL 値,則 Updategram 會將資料行値設定為 NULL。如果資料行沒有預設值,也不接受 NULL 値,則命令會失敗,而 Updategam 傳回錯誤。選擇性的 updg:returnid 屬性會用來傳回識別值,此值會在以 IDENTITY 類型的資料行將記錄加入至資料表時產生。

updg:id 屬性

如果 Updategram 只插入記錄,就不需要 updg:id 屬性。如需有關 updg:id 的詳細資訊,請參閱<使用 XML Updategram 更新資料 (SQLXML 4.0)>。

updg:at-identity 屬性

當 Updategram 在具有 IDENTITY 類型之資料行的資料表中插入記錄時,就可以使用選擇性的 updg:at-identity 屬性來擷取系統指派值。Updategram 接著可以在後續作業中使用此値。在執行 Updategram 時,您可以指定 updg:returnid 屬性以傳回產生的識別值。

updg:guid 屬性

updg:guid 屬性是選擇性的屬性,會產生全域唯一識別碼。此値在指定位置所在的整個 <sync> 區塊中都會在範圍內。您可以將此値用於 <sync> 區塊中的任何位置。該屬性會呼叫 NEWGUID()SQL Server 函數以產生唯一識別碼。

範例

若要使用下列範例建立工作範例,您必須符合<執行 SQLXML 範例的需求>中指定的需求。

使用 Updategram 範例之前,請注意下列事項:

  • 大部分的範例都會使用預設對應 (也就是說,Updategram 中不會指定任何對應結構描述)。如需使用對應結構描述的其他 Updategram 範例,請參閱<在 Updategram 中指定註解式對應結構描述 (SQLXML 4.0)>。

  • 大部分的範例會使用 AdventureWorks 範例資料庫。所有的更新都會套用到此資料庫內的資料表。您可以還原 AdventureWorks 資料庫。如需有關還原 AdventureWorks 資料庫的詳細資訊,請參閱<AdventureWorks 範例資料庫>。

A. 使用 Updategram 插入記錄

這個屬性中心的 Updategram 會在 AdventureWorks 資料庫中的 HumanResources.Employee 資料表內插入記錄。

在此範例中,Updategram 不會指定對應結構描述。因此 Updategram 會使用預設對應,其中元素的名稱會對應到資料表名稱,而屬性或子元素則會對應到該資料表中的資料行。

HumanResources.Employee 資料表的 AdventureWorks 結構描述會對 ManagerID 和 EmployeeID 以外的所有資料行賦予 'not null' 限制,因此 Updategram 必須包含針對這兩個資料行以外的所有資料行所指定的值。ManagerID 會遭到省略,所以其值在執行 Updategram 時是 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. 複製上述的 Updategram,並將其貼到文字檔中。將檔案儲存為 MyUpdategram.xml。

  2. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 來執行範本。

    如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

在元素中心的對應中,Updategram 與下列類似:

<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>

在混合模式 (元素中心和屬性中心) 的 Updategram 中,元素可以同時具有屬性和子元素,如以下 Updategram 所示:

<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. 使用 Updategram 插入多筆記錄

這個 Updategram 會將兩筆新的值班記錄加入至 HumanResources.Shift 資料表。Updategram 不會指定選擇性的 <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,並將其貼到文字檔中。將檔案儲存為 Updategram-AddShifts.xml。

  2. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 來執行範本。

    如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

這個範例的另一個版本是使用兩個個別的 <after> 區塊 (而不是一個區塊) 來插入這兩個員工的 Updategram。這是有效的方法,編碼方式如下:

<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. 使用在 XML 中無效的有效 SQL Server 字元

在 SQL Server 中,資料表名稱可以包含空格,例如 Northwind 資料庫中的 Order Details 資料表。不過,這在 XML 字元中並非有效,亦即它雖是有效的 SQL Server 識別碼,卻不是有效的 XML 識別碼;可以使用 '__xHHHH__' 當做編碼值來進行編碼,其中 HHHH 代表在最大顯著性位元第一順序下,該字元的四位數十六進位 UCS-2 代碼。

[!附註]

此範例使用 Northwind 資料庫,這是最初由 SQL Server 2000 所提供的範例資料庫。較新的 SQL Server 版本則沒有提供 Northwind 資料庫。不過,您可以使用下載取得的 SQL 指令碼來安裝 Northwind 資料庫。如需詳細資訊,請參閱<下載 Northwind 和 pubs 範例資料庫>。

此外,元素名稱也必須加上方括號 ([ ])。因為字元 [ 和 ] 在 XML 中都是無效的,所以必須先將其分別編碼為 _x005B_ 和 _x005D_ (如果您使用對應結構描述,則可以提供不包含空格之類無效字元的元素。對應結構描述會進行必要的對應,因此您就不必進行這些字元的編碼)。

下列 Updategram 會在 Northwind 資料庫的 Order Details 資料表中加入記錄:

<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 類型),必須將錢幣符號字元 ($) 加入為値的一部分。如果 Updategram 未指定對應結構描述,則會評估 string 値的第一個字元。如果第一個字元為錢幣符號 ($),則會套用適當的轉換。

如果 Updategram 是針對對應結構描述而指定,且其中的資料行適當地標示為 dt:type="fixed.14.4" 或 sql:datatype="money",則不需要錢幣符號 ($),轉換作業會由對應來處理。這是建議的方式,可確保進行的是適當的類型轉換。

針對結構描述測試範例 XPath 查詢

  1. 複製上述的 Updategram,並將其貼到文字檔中。將檔案儲存為 UpdategramSpacesInTableName.xml。

  2. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 來執行範本。

    如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

D. 使用 at-identity 屬性來擷取插入至 IDENTITY 類型之資料行的値

下列 Updategram 會插入兩筆記錄:在 Sales.SalesOrderHeader 資料表中插入一筆,而在 Sales.SalesOrderDetail 資料表中插入另一筆。

首先,Updategram 會將記錄加入至 Sales.SalesOrderHeader 資料表。在這個資料表中,SalesOrderID 資料行是 IDENTITY 類型的資料行。因此,當您將這筆記錄加入至該資料表時,Updategram 會使用 at-identity 屬性,將指派的 SalesOrderID 値擷取為 "x" (預留位置值)。接著 Updategam 會將 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 屬性所產生的識別值,可以使用 updg:returnid 屬性。下列是經過修改的 Updategram,會傳回這個識別值 (此 Updategram 會加入兩筆訂單記錄和兩筆訂單詳細資料的記錄,以稍微增加範例的複雜度)。

<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>

Updategram 在執行時會傳回類似下列的結果,其中包含所產生的識別値 (可用於資料表識別的 ShiftID 資料行產生値):

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

針對結構描述測試範例 XPath 查詢

  1. 複製上述的 Updategram,並將其貼到文字檔中。將檔案儲存為 Updategram-returnId.xml。

  2. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 來執行範本。

    如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

E. 使用 updg:guid 屬性來產生唯一値

在這個範例中,Updategram 會在 Cust 和 CustOrder 資料表中插入記錄,此外,該 Updategram 也會使用 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>

Updategram 會指定 returnid 屬性。因此會傳回所產生的 GUID:

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

測試 Updategram

  1. 複製上述的 Updategram,並將其貼到文字檔中。將檔案儲存為 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. 在 Updategram 中指定結構描述

這個範例中的 Updategram 會在下列資料表中插入記錄:

CustOrder(OrderID, EmployeeID, OrderType)

這個 Updategram 中指定了 XSD 結構描述 (也就是說,沒有 Updategram 元素和屬性的預設對應)。該結構描述提供元素和屬性對資料庫資料表和資料行的必要對應。

下列的結構描述 (CustOrderSchema.xml) 描述由 OrderIDEmployeeID 屬性所組成的 <CustOrder> 元素。為了讓結構描述更有可看性,會將預設值指派給 EmployeeID 屬性。Updategram 只會將屬性的預設值用於插入作業,而且只有在 Updategram 未指定該屬性時才會這麼做。

<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>

這個 Updategram 會將記錄插入至 CustOrder 資料表。Updategram 只會指定 OrderID 和 EmployeeID 屬性值,而不會指定 OrderType 屬性值。因此,Updategram 會使用在前述結構描述中所指定之 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>

如需指定對應結構描述的其他 Updategram 範例,請參閱<在 Updategram 中指定註解式對應結構描述 (SQLXML 4.0)>。

測試 Updategram

  1. tempdb 資料庫中建立這個資料表:

    USE tempdb
    CREATE TABLE CustOrder(
                     OrderID int, 
                     EmployeeID int, 
                     OrderType int)
    
  2. 複製上述的結構描述,並將其貼到文字檔中。然後將檔案儲存為 CustOrderSchema.xml。

  3. 複製上述的 Updategram,並將其貼到文字檔中。然後將檔案在前述步驟所使用的相同資料夾中,儲存為 CustOrderUpdategram.xml。

  4. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 以執行 Updategram。

    如需詳細資訊,請參閱<使用 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 値,可以在 Updategram 中的元素上指定 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" 。下列 Updategram 會使用這個結構描述:

<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>

Updategram 會為 <after> 區塊中的 <fname> 元素指定 xsi:nil。因此,這個 Updategram 在執行時,會為資料表中的 first_name 資料行插入 NULL 値。

測試 Updategram

  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. 複製上述的 Updategram,並將其貼到文字檔中。然後將檔案在前述步驟所使用的相同資料夾中,儲存為 StudentUpdategram.xml 以儲存 StudentSchema.xml。

  4. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 以執行 Updategram。

    如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

H. 在 Updategram 中指定命名空間

您在 Updategram 中所擁有的元素,可能會屬於在 Updategram 的相同元素中宣告的命名空間。在這種情況下,相對應的結構描述必須也要宣告相同的命名空間,且元素必須屬於該目標命名空間。

例如,在下列 Updategram (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>

測試 Updategram

  1. 複製上述的結構描述,並將其貼到文字檔中。將檔案儲存為 XSD-ElementHavingNamespace.xml。

  2. 複製上述的 Updategram,並將其貼到文字檔中。在用來儲存 XSD-ElementHavingnamespace.xml 的相同資料夾中,將檔案儲存為 Updategram-ElementHavingNamespace.xml。

  3. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 以執行 Updategram。

    如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

I. 將資料插入至 XML 資料類型資料行

xml 資料類型是在 SQL Server 2005 中導入。您可以在下列前提下,使用 Updategram 來插入及更新以 xml 資料類型資料行所儲存的資料:

  • xml 資料行不可以用來識別現有的資料列,因此不能包含在 Updategram 的 updg:before 區段中。

  • 位於插入至 xml 資料行的 XML 片段範圍內的命名空間會受到保存,而其命名空間宣告則會加入至所插入片段的最上層元素。

例如,在下列 Updategram (SampleUpdateGram.xml) 中,<Desc> 元素會更新 AdventureWorks 範例資料庫的 Production>productModel 資料表內的 ProductDescription 資料行。這個 Updategram 的結果是 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>

Updategram 會參考下列的註解 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>

測試 Updategram

  1. 複製上述的結構描述,並將其貼到文字檔中。然後將檔案儲存為 XSD-SampleSchema.xml。

    [!附註]

    因為 Updategram 支援預設對應,所以沒辦法識別 xml 資料類型的開始和結尾。這表示在插入或更新具有 xml 資料類型資料行的資料表時,需要使用對應結構描述。如果沒有提供結構描述,則 SQLXML 會傳回錯誤,指出資料表中遺失其中一個資料行。

  2. 複製上述的 Updategram,並將其貼到文字檔中。然後將檔案在用來儲存 SampleSchema.xml 的相同資料夾中,儲存為 SampleUpdategram.xml。

  3. 建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 以執行 Updategram。

    如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。