Udostępnij za pomocą


Wstawianie danych przy użyciu aktualigramów XML (SQLXML 4.0)

Dotyczy:programu SQL ServerAzure SQL Database

Updategram wskazuje operację wstawiania, gdy wystąpienie rekordu <after> pojawia się w bloku, ale nie w odpowiednim <before> bloku. W takim przypadku updategram wstawia rekord w <after> bloku do bazy danych.

Jest to format updategramu dla operacji wstawiania:

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

blok <before>

Blok <before> można pominąć dla operacji wstawiania. Jeśli opcjonalny mapping-schema atrybut nie jest określony, <ElementName> określony w updategram mapuje na tabelę bazy danych, a elementy podrzędne lub atrybuty mapuje na kolumny w tabeli.

blok <after>

W bloku można określić co najmniej jeden rekord <after> .

<after> Jeśli blok nie dostarcza wartości dla określonej kolumny, updategram używa wartości domyślnej określonej w schemacie z adnotacjami (jeśli określono schemat). Jeśli schemat nie określa wartości domyślnej dla kolumny, updategram nie określa żadnej jawnej wartości w tej kolumnie, a zamiast tego przypisuje wartość domyślną programu SQL Server (jeśli określono) do tej kolumny. Jeśli nie ma wartości domyślnej programu SQL Server, a kolumna akceptuje NULL wartość, updategram ustawia wartość kolumny na NULLwartość . Jeśli kolumna nie ma wartości domyślnej lub akceptuje wartość, polecenie kończy się niepowodzeniem NULL , a updategram zwraca błąd. Opcjonalny updg:returnid atrybut służy do zwracania wartości tożsamości generowanej przez system po dodaniu rekordu w tabeli z kolumną IDENTITY-type.

Atrybut updg:id

Jeśli updategram wstawia tylko rekordy, updategram nie wymaga atrybutu updg:id . Aby uzyskać więcej informacji na temat updg:idprogramu , zobacz Aktualizowanie danych przy użyciu updategramów XML (SQLXML 4.0).

Atrybut updg:at-identity

Gdy updategram wstawia rekord w tabeli z kolumną IDENTITY-type, updategram może przechwycić przypisaną przez system wartość przy użyciu opcjonalnego updg:at-identity atrybutu. Updategram może następnie użyć tej wartości w kolejnych operacjach. Po wykonaniu updategramu można zwrócić wartość tożsamości, która jest generowana przez określenie atrybutu updg:returnid .

Atrybut updg:guid

Atrybut updg:guid jest opcjonalnym atrybutem, który generuje globalnie unikatowy identyfikator. Ta wartość pozostaje w zakresie całego <sync> bloku, w którym jest określony. Możesz użyć tej wartości w dowolnym miejscu w <sync> bloku. Atrybut wywołuje NEWGUID() funkcję programu SQL Server w celu wygenerowania unikatowego identyfikatora.

Przykłady

Aby utworzyć działające przykłady przy użyciu poniższych przykładów, należy spełnić wymagania określone w temacie Wymagania dotyczące uruchamiania przykładów SQLXML.

Przed użyciem przykładów updategramu rozważ następujące kwestie:

A. Wstawianie rekordu przy użyciu aktualizatora

Ten aktualizator skoncentrowany na atrybutach wstawia rekord w HumanResources.Employee tabeli w AdventureWorks2025 bazie danych.

W tym przykładzie updategram nie określa schematu mapowania. W związku z tym updategram używa mapowania domyślnego, w którym nazwa elementu jest mapowania na nazwę tabeli, a atrybuty lub elementy podrzędne mapuje na kolumny w tej tabeli.

Schemat AdventureWorks2025 tabeli HumanResources.Department nakłada ograniczenie "nie null" dla wszystkich kolumn. W związku z tym updategram musi zawierać wartości określone dla wszystkich kolumn. Identyfikator działu to kolumna IDENTITY-type. W związku z tym żadne wartości nie są dla niego określone.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Department Name="New Product Research" GroupName="Research and Development" ModifiedDate="2010-08-31" />
    </updg:after>
  </updg:sync>
</ROOT>

Testowanie przykładowego zapytania XPath względem schematu

  1. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik jako MyUpdategram.xml.

  2. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go do wykonania szablonu.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

W mapowaniu skoncentrowanym na elementach updategram wygląda następująco:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Department>
        <Name> New Product Research </Name>
        <GroupName> Research and Development </GroupName>
        <ModifiedDate>2010-08-31</ModifiedDate>
      </HumanResources.Department>
    </updg:after>
  </updg:sync>
</ROOT>

W aktualizatorze skoncentrowanym na elementach i atrybutach w trybie mieszanym element może zawierać zarówno atrybuty, jak i podelementy, jak pokazano w tym updategramie:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Department Name="New Product Research">
        <GroupName>Research and Development</GroupName>
        <ModifiedDate>2010-08-31</ModifiedDate>
      </HumanResources.Department>
    </updg:after>
  </updg:sync>
</ROOT>

B. Wstawianie wielu rekordów przy użyciu aktualizatora

Ten updategram dodaje dwa nowe rekordy przesunięcia do HumanResources.Shift tabeli. Updategram nie określa opcjonalnego <before> bloku.

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

Testowanie przykładowego zapytania XPath względem schematu

  1. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik jako Updategram-AddShifts.xml.

  2. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go do wykonania szablonu.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

Inną wersją tego przykładu jest updategram, który używa dwóch oddzielnych <after> bloków zamiast jednego bloku w celu wstawienia dwóch pracowników. Jest to prawidłowe i może być zakodowane w następujący sposób:

<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. Praca z prawidłowymi znakami programu SQL Server, które nie są prawidłowe w formacie XML

W programie SQL Server nazwy tabel mogą zawierać spację, taką jak tabela Order Details w bazie danych Northwind. Nie jest to jednak prawidłowe w postaci znaków XML, które są prawidłowymi identyfikatorami programu SQL Server, ale nie prawidłowymi identyfikatorami XML można kodować przy użyciu _xHHHH_ jako wartości kodowania, gdzie HHHH oznacza czterocyfrowy kod szesnastkowy UCS-2 dla znaku w najbardziej znaczącej kolejności bitów.

Uwaga / Notatka

W tym przykładzie użyto bazy danych Northwind. Bazę danych Northwind można zainstalować przy użyciu skryptu SQL dostępnego do pobrania z tej witryny sieci Web firmy Microsoft.

Ponadto nazwa elementu musi być ujęta w nawiasy kwadratowe ([ ]). Ponieważ znaki [i] nie są prawidłowe w kodzie XML, należy je zakodować odpowiednio jako _x005B_ i _x005D_. (Jeśli używasz schematu mapowania, możesz podać nazwy elementów, które nie zawierają nieprawidłowych znaków, takich jak białe spacje. Schemat mapowania wykonuje niezbędne mapowanie; w związku z tym nie musisz kodować tych znaków).

Ten updategram dodaje rekord do tabeli Order Details w bazie danych Northwind:

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

Kolumna UnitPrice w tabeli Order Details jest typu pieniądze . Aby zastosować odpowiednią konwersję typu (z typu ciągu do typu pieniędzy ), znak dolara ($) należy dodać jako część wartości. Jeśli updategram nie określi schematu mapowania, zostanie obliczony pierwszy znak wartości ciągu . Jeśli pierwszy znak jest znakiem dolara ($), zostanie zastosowana odpowiednia konwersja.

Jeśli updategram jest określony względem schematu mapowania, w którym kolumna jest odpowiednio oznaczona jako dt:type="fixed.14.4" lub sql:datatype="money", znak dolara ($) nie jest wymagany i konwersja jest obsługiwana przez mapowanie. Jest to zalecany sposób zapewnienia, że wystąpi odpowiednia konwersja typów.

Testowanie przykładowego zapytania XPath względem schematu

  1. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik jako UpdategramSpacesInTableName.xml.

  2. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go do wykonania szablonu.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

D. Użyj atrybutu at-identity, aby pobrać wartość wstawioną w kolumnie IDENTITY-type

Następujący updategram wstawia dwa rekordy: jeden w Sales.SalesOrderHeader tabeli, a drugi w Sales.SalesOrderDetail tabeli.

Najpierw updategram dodaje rekord do Sales.SalesOrderHeader tabeli. W tej tabeli kolumna SalesOrderID jest kolumną IDENTITY-type. W związku z tym podczas dodawania tego rekordu do tabeli updategram używa atrybutu at-identity do przechwytywania przypisanej wartości SalesOrderID jako "x" (wartość symbolu zastępczego). Następnie Updategram określa tę at-identity zmienną jako wartość atrybutu SalesOrderID w elememencie <Sales.SalesOrderDetail> .

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

Jeśli chcesz zwrócić wartość tożsamości, która jest generowana przez updg:at-identity atrybut, możesz użyć atrybutu updg:returnid . Poniższy przykład to poprawiony updategram, który zwraca tę wartość tożsamości. (Ten updategram dodaje dwa rekordy zamówień i dwa rekordy szczegółów zamówienia, tylko w celu utworzenia przykładu nieco bardziej złożonego).

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

Po wykonaniu aktualizatora zwraca wyniki podobne do poniższego przykładu, który zawiera wartość tożsamości (wygenerowaną wartość kolumny ShiftID użytą dla tożsamości tabeli), która została wygenerowana:

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

Testowanie przykładowego zapytania XPath względem schematu

  1. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik jako Updategram-returnId.xml.

  2. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go do wykonania szablonu.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

E. Użyj atrybutu updg:guid , aby wygenerować unikatową wartość

W tym przykładzie updategram wstawia rekord w tabelach Cust i CustOrder. Ponadto updategram generuje unikatową wartość atrybutu CustomerID przy użyciu atrybutu updg:guid .

<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 określa returnid atrybut. W związku z tym zwracany jest wygenerowany identyfikator GUID:

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

Testowanie aktualizatora

  1. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik jako Updategram-GenerateGuid.xml.

  2. Utwórz następujące tabele:

    USE tempdb;
    
    CREATE TABLE Cust
    (
        CustID UNIQUEIDENTIFIER,
        LastName VARCHAR (20)
    );
    
    CREATE TABLE CustOrder
    (
        CustID UNIQUEIDENTIFIER,
        OrderID INT
    );
    
  3. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go do wykonania szablonu.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

F. Określanie schematu w updategramie

Updategram w tym przykładzie wstawia rekord do następującej tabeli:

CustOrder(OrderID, EmployeeID, OrderType)

Schemat XSD jest określony w tym updategramie (czyli nie ma domyślnego mapowania elementów i atrybutów updategramu). Schemat zawiera niezbędne mapowanie elementów i atrybutów do tabel i kolumn bazy danych.

W poniższym schemacie (CustOrderSchema.xml) opisano <CustOrder> element składający się z OrderID atrybutów i .EmployeeID Aby uczynić schemat bardziej interesującym, do atrybutu zostanie przypisana wartość domyślna EmployeeID . Updategram używa wartości domyślnej atrybutu tylko dla operacji wstawiania, a następnie tylko wtedy, gdy updategram nie określi tego atrybutu.

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

Ten updategram wstawia rekord do tabeli CustOrder. Updategram określa tylko wartości atrybutów OrderID i EmployeeID. Nie określa wartości atrybutu OrderType. W związku z tym updategram używa wartości domyślnej atrybutu EmployeeID określonego w poprzednim schemacie.

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

Aby uzyskać więcej przykładów aktualizacji określających schemat mapowania, zobacz Określanie schematu mapowania adnotacji w updategramie (SQLXML 4.0).

Testowanie aktualizatora

  1. Utwórz tę tabelę tempdb w bazie danych:

    USE tempdb;
    
    CREATE TABLE CustOrder
    (
        OrderID INT,
        EmployeeID INT,
        OrderType INT
    );
    
  2. Skopiuj poprzedni schemat i wklej go do pliku tekstowego. Zapisz plik jako CustOrderSchema.xml.

  3. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik w CustOrderUpdategram.xml tym samym folderze, który był używany w poprzednim kroku.

  4. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go, aby wykonać updategram.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

Jest to równoważny schemat 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. Użyj atrybutu xsi:nil, aby wstawić wartości null w kolumnie

Jeśli chcesz wstawić wartość null w odpowiedniej kolumnie w tabeli, możesz określić xsi:nil atrybut na elemecie updategram. W odpowiednim schemacie XSD należy również określić atrybut XSD nillable .

Rozważmy na przykład ten schemat 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>

Schemat XSD określa nillable="true" dla <fname> elementu. Następujący updategram używa tego schematu:

<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 określa xsi:nil element <fname> w <after> bloku. W związku z tym po wykonaniu tego aktualizatora wartość NULL jest wstawiana dla kolumny first_name w tabeli.

Testowanie aktualizatora

  1. Utwórz następującą tabelę tempdb w bazie danych:

    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. Skopiuj poprzedni schemat i wklej go do pliku tekstowego. Zapisz plik jako StudentSchema.xml.

  3. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik, co StudentUpdategram.xml w tym samym folderze użytym w poprzednim kroku, aby zapisać plik StudentSchema.xml.

  4. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go, aby wykonać updategram.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

H. Określanie przestrzeni nazw w updategramie

W updategramie można mieć elementy, które należą do przestrzeni nazw zadeklarowanej w tym samym elemecie w updategramie. W takim przypadku odpowiedni schemat musi również zadeklarować tę samą przestrzeń nazw, a element musi należeć do tej docelowej przestrzeni nazw.

Na przykład w poniższym updategramie (UpdateGram-ElementHavingNamespace.xml) <Order> element należy do przestrzeni nazw zadeklarowanej w elemecie .

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

W takim przypadku schemat musi również zadeklarować przestrzeń nazw, jak pokazano w tym schemacie:

Poniższy schemat (XSD-ElementHavingNamespace.xml) pokazuje, jak należy zadeklarować odpowiedni element i atrybuty.

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

Testowanie aktualizatora

  1. Skopiuj poprzedni schemat i wklej go do pliku tekstowego. Zapisz plik jako XSD-ElementHavingNamespace.xml.

  2. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik w Updategram-ElementHavingNamespace.xml tym samym folderze, który został użyty do zapisania XSD-ElementHavingnamespace.xmlpliku .

  3. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go, aby wykonać updategram.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).

I. Wstawianie danych do kolumny typu danych XML

Za pomocą updategramów można wstawiać i aktualizować dane przechowywane w kolumnach typu danych XML , korzystając z następujących zagadnień:

  • Nie można użyć kolumny XML do identyfikowania istniejącego wiersza. W związku z tym nie można jej uwzględnić w updg:before sekcji updategramu.

  • Przestrzenie nazw, które znajdują się w zakresie fragmentu XML wstawionego do kolumny XML , są zachowywane, a ich deklaracje przestrzeni nazw są dodawane do górnego elementu wstawionego fragmentu.

Na przykład w poniższym updategramie (SampleUpdateGram.xml) <Desc> element aktualizuje kolumnę ProductDescription w tabeli Production>productModel w przykładowej AdventureWorks2025 bazie danych. Wynikiem tego updategramu jest to, że zawartość XML kolumny ProductDescription jest aktualizowana przy użyciu zawartości <Desc> XML elementu.

<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 href="ProductDescription.xsl" type="text/xsl" e="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" xmlns="">
            <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; aluminum 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>Aluminum 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 odnosi się do następującego schematu XSD z adnotacjami (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="http://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>
Testowanie aktualizatora
  1. Skopiuj poprzedni schemat i wklej go do pliku tekstowego. Zapisz plik jako XSD-SampleSchema.xml.

    Uwaga / Notatka

    Ponieważ updategramy obsługują mapowanie domyślne, nie ma możliwości identyfikowania początku i zakończenia typu danych XML . Oznacza to, że schemat mapowania jest wymagany podczas wstawiania lub aktualizowania tabel z kolumnami typu danych XML . Jeśli schemat nie zostanie podany, program SQLXML zwraca błąd wskazujący, że w tabeli brakuje jednej z kolumn.

  2. Skopiuj poprzedni updategram i wklej go do pliku tekstowego. Zapisz plik w SampleUpdategram.xml tym samym folderze, który został użyty do zapisania SampleSchema.xmlpliku .

  3. Utwórz skrypt testowy SQLXML 4.0 (Sqlxml4test.vbs) i użyj go, aby wykonać updategram.

    Aby uzyskać więcej informacji, zobacz Using ADO to Execute SQLXML 4.0 Queries (Używanie narzędzia ADO do wykonywania zapytań SQLXML 4.0).