Поделиться через


Общие сведения о диаграммах обновления (SQLXML 4.0)

С помощью диаграммы обновления или функции OPENXML языка Transact-SQL можно производить изменение базы данных в Microsoft SQL Server из существующего XML-документа (вставку, обновление и удаление).

Функция OPENXML изменяет базу данных, разделяя существующий XML-документ и формируя набор строк, который можно передавать инструкциям INSERT, UPDATE и DELETE. С помощью функции OPENXML операции выполняются непосредственно с таблицами базы данных. Поэтому использование функции OPENXML является наиболее оптимальным вариантом во всех случаях, когда поставщики наборов строк, например таблицы, могут быть источниками.

Диаграммы обновления, подобно функции OPENXML, позволяют вставлять, обновлять и удалять данные в базе данных. Однако диаграммы обновления работают не с таблицами, а с XML-представлениями, создаваемыми аннотированной XSD-схемой (или XDR-схемой); например, обновления применяются к XML-представлению, созданному сопоставляемой схемой. Схема сопоставления в свою очередь содержит данные, необходимые для сопоставления XML-элементов и атрибутов с соответствующими таблицами и столбцами базы данных. Диаграмма обновления использует эти данные сопоставления, чтобы выполнить обновление таблиц и столбцов базы данных.

ПримечаниеПримечание

Настоящая документация предназначена для тех, кто знаком с шаблонами и поддержкой схем сопоставления в SQL Server. Дополнительные сведения см. в разделе Введение в схемы XSD с заметками (SQLXML 4.0). Сведения о приложениях прежних версий, которые используют XDR, см. в разделе Схемы XDR с заметками (устарели в SQLXML 4.0).

Обязательные пространства имен в диаграмме обновления

Ключевые слова в диаграмме обновления, например <sync>, <before> и <after>, существуют в пространстве имен urn:schemas-microsoft-com:xml-updategram. Префикс пространства имен может быть произвольным. В этой документации префикс updg обозначает пространство имен updategram.

Обзор синтаксиса

Диаграмма обновления представляет собой шаблон с блоками <sync>, <before> и <after>, формирующими синтаксис диаграммы обновления. Следующий код показывает этот синтаксис в его простейшей форме:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >
    <updg:before>
        ...
    </updg:before>
    <updg:after>
        ...
    </updg:after>
  </updg:sync>
</ROOT>

Следующие определения описывают роль каждого блока.

  • <before>
    Определяет текущее состояние (называемое также «исходным состоянием») экземпляра записи.

  • <after>
    Определяет новое состояние изменяемых данных.

  • <sync>
    Содержит блоки <before> и <after>. Блок <sync> может включать несколько наборов блоков <before> и <after>. Если имеется более одного набора блоков <before> и <after> , они должны указываться парами (даже если они пустые). Более того, диаграмма обновления может иметь несколько блоков <sync>. Каждый блок <sync> является одной единицей транзакции (это означает, что блок <sync> выполняется целиком или не выполняется вообще). Если в диаграмме обновления задано несколько блоков <sync>, то неудачное завершение одного блока <sync> не влияет на остальные блоки <sync> .

Будет ли диаграмма обновления удалять, вставлять или обновлять экземпляр записи, зависит от содержимого блоков <before> и <after> .

  • Если экземпляр записи имеется только в блоке <before> без соответствующего экземпляра в блоке <after>, диаграмма обновления выполняет операцию удаления.

  • Если экземпляр записи имеется только в блоке <after> без соответствующего экземпляра в блоке <before> , диаграмма обновления выполняет операцию вставки.

  • Если экземпляр записи имеется только в блоке <before> без соответствующего экземпляра в блоке <after>, диаграмма обновления выполняет операцию обновления. В этом случае диаграмма обновления обновляет экземпляр записи до значений, заданных в блоке <after> .

Указание сопоставления схемы в диаграмме обновления

В диаграмме обновления XML-абстракция, созданная сопоставляемой схемой (поддерживаются схемы XSD и XDR), может быть явной или неявной (то есть диаграмма обновления может работать как с заданной схемой сопоставления, так и без нее). Если схема сопоставления не задана, то диаграмма обновления предполагает неявное сопоставление (сопоставление по умолчанию), в котором каждый элемент блока <before> или <after> сопоставляется с таблицей, а каждый его дочерний элемент или атрибут сопоставляется со столбцом базы данных. Если схема сопоставления указана явно, то элементы и атрибуты в диаграмме обновления должны совпадать с элементами и атрибутами сопоставляемой схемы.

Неявное сопоставление (по умолчанию)

В большинстве случаев диаграмма обновления, выполняющая простые обновления, не требует схемы сопоставления. В такой ситуации диаграмма обновления полагается на схему сопоставления, принятую по умолчанию.

В следующей диаграмме обновления показано неявное сопоставление. В этом примере диаграмма обновления применяется для вставки данных нового клиента в таблицу Sales.Customer. В этой диаграмме обновления используется неявное сопоставление, поэтому элемент <Sales.Customer> сопоставляется с таблицей Sales.Customer, а атрибуты CustomerID и SalesPersonID сопоставляются с соответствующими столбцами той же таблицы.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
    <Sales.Customer CustomerID="1" SalesPersonID="277" />
    </updg:after>
</updg:sync>
</ROOT>

Явное сопоставление

Если указывается схема сопоставления (XSD или XDR), диаграмма обновления использует эту схему для определения подлежащих обновлению таблиц и столбцов базы данных.

Если диаграмма обновления выполняет сложное обновление (например, вставку записей в несколько таблиц на основе связи «родители-потомки», заданной в схеме сопоставления), необходимо явно задать схему сопоставления с помощью атрибута mapping-schema, по которому выполняется диаграмма обновления.

Диаграмма обновления является шаблоном, поэтому заданный в ней путь для схемы сопоставления зависит от расположения файла шаблона (является относительным). Дополнительные сведения см. в разделе Определение схемы с заметками сопоставления в диаграмме обновления (SQLXML 4.0).

Элементная и атрибутивная модель сопоставления в диаграммах обновления

При сопоставлении по умолчанию (когда сопоставляемая схема не указывается в диаграмме обновления), элементы диаграммы обновления сопоставляются с таблицами и дочерними элементами (в случае элементной модели сопоставления), а атрибуты сопоставляются со столбцами (в случае атрибутивной модели сопоставления).

Сопоставление, ориентированное на элементы

В диаграмме обновления, основанной на элементах, элемент содержит дочерние элементы, обозначающие свойства этого элемента. В качестве примера см. следующую диаграмму обновления. Элемент <Person.Person> содержит дочерние элементы <FirstName> и <LastName>. Эти дочерние элементы являются свойствами элемента <Person.Person>.

В этой диаграмме обновления не задана схема сопоставления, поэтому в ней используется неявное сопоставление, в котором элемент <Person.Person> сопоставляется с таблицей Person.Person, а его дочерние элементы — со столбцами FirstName и LastName.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:after>
    <Person.Person>
       <FirstName>Catherine</FirstName>
       <LastName>Abel</LastName>
    </Person.Person>
  </updg:after>
</updg:sync>
</ROOT>

Атрибутивное сопоставление

В атрибутивной модели сопоставления элементы имеют атрибуты. В следующей диаграмме обновления используется атрибутивная модель сопоставления. В этом примере элемент <Person.Person> состоит из атрибутов FirstName и LastName. Эти атрибуты являются свойствами элемента <Person.Person>. Как и в предыдущем примере, в этой диаграмме обновления не указана схема сопоставления, поэтому она сопоставляет элемент <Person.Person> с таблицей Person.Person и атрибутами элементов в соответствующих столбцах этой таблицы.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Person FirstName="Catherine" LastName="Abel" />
  </updg:after>
</updg:sync>
</ROOT>

Одновременное использование элементной и атрибутивной моделей сопоставления

Можно использовать сочетание элементной и атрибутивной моделей сопоставления, как показано в следующей диаграмме обновления. Обратите внимание, что элемент <Person.Person> содержит и атрибут, и дочерний элемент. Кроме того, в этой диаграмме обновления используется неявное сопоставление. Таким образом, атрибут FirstName и дочерний элемент <LastName> сопоставляются с соответствующими столбцами в таблице Person.Person.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Person FirstName="Catherine" >
       <LastName>Abel</LastName>
    </Person.Person>
  </updg:after>
</updg:sync>
</ROOT>

Работа с символами, допустимыми в SQL Server, но не допустимыми в XML

В SQL Server имена таблиц могут содержать пробелы. Но в XML имена таблиц такого типа не допускаются.

Для представления символов, являющихся допустимыми в идентификаторах SQL Server, но не разрешенных в идентификаторах XML, используется кодовое значение "xHHHH", где HHHH — четырехразрядный шестнадцатеричный код символа в UCS-2 с расположением двоичных разрядов в порядке убывания значимости от первого к последнему. При использовании этой схемы кодирования символ пробела замещается x0020 (четырехразрядный шестнадцатеричный код пробела) и, таким образом, имя таблицы [Order Details] в SQL Server в XML приобретает вид x005B_Order_x0020_Details_x005D.

Точно так же можно указывать трехкомпонентные имена элементов, например <[database].[owner].[table]>. В XML символы квадратных скобок ([ и ]) недопустимы, поэтому можно указать это имя как <x005B_database_x005D.x005B_owner_x005D.x005B_table_x005D>, где x005B заменяет левую квадратную скобку ([), а x005D — правую (]).

Выполнение диаграмм обновления

Диаграмма обновления является шаблоном, поэтому к ней применяются все механизмы обработки шаблона. В SQLXML 4.0 диаграмму обновления можно выполнить следующими способами:

  • с помощью команды ADO;

  • с помощью команды OLE DB.