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


Задание связей с помощью sql:relationship (схема XDR)

Важное примечаниеВажно!

Этот раздел включен в документацию в качестве справочника по приложениям прежних версий. Дальнейшая разработка этой функции проводиться не будет. Рекомендуется избегать использования данной функции в новых разработках. Вместо этого для создания XML-представлений пользуйтесь схемами XSD с заметками. Дополнительные сведения см. в разделе Введение в схемы XSD с заметками (SQLXML 4.0). Можно преобразовать существующие схемы XDR с заметками в схемы XSD. Дополнительные сведения см. в разделе Преобразование схем XDR с заметками в эквивалентные схемы XSD (SQLXML 4.0).

Элементы в XML-документе могут участвовать в связях. Элементы могут иметь иерархическую вложенность, и между ними могут быть заданы связи ID, IDREF или IDREFS.

Например, в схеме XDR элемент <Customer> содержит дочерние элементы <Order>. Элемент <Customer> сопоставляется таблице, которая содержит данные о заказчике (такой как Sales.Customer в базе данных AdventureWorks). Элемент <Order> сопоставляется таблице, которая содержит данные о заказе в той же базе данных (такой как Sales.SalesORderHeader). Базовые таблицы Sales.Customer и Sales.SalesOrderHeader связаны, так как заказчики размещают заказы. CustomerID в таблице Sales.SalesOrderHeader представляет собой внешний ключ, ссылающийся на первичный ключ CustomerID в таблице Sales.Customer. Можно установить эти связи между соответствующими элементами схемы с использованием заметки <sql:relationship>.

В аннотированной схеме XDR заметка <sql:relationship> используется для иерархического вложения элементов схемы на основе связях между внешним ключом и первичным ключом среди базовых таблиц, которым сопоставляется элемент. Назначая заметку <sql:relationship>, необходимо указать:

  • Главную таблицу (Sales.Customer) и внешнюю таблицу (Sales.SalesOrderHeader), и

  • Необходимое условие соединения (CustomerID в таблице Sales.SalesOrderHeader представляет собой внешний ключ, ссылающийся на первичный ключ CustomerID в таблице Sales.Customer).

Эти сведения используются при формировании правильной иерархии (для каждого элемента <customer>, связанные элементы <order> отображаются как дочерние элементы).

Чтобы предоставить имена таблиц и необходимые сведения о соединении, следующие атрибуты указываются с использованием заметки <sql:relationship>. Эти атрибуты действительны только с элементом sql:relationship:

  • key-relation
    Задает главное взаимоотношение (таблицу).

  • key
    Указывает первичный ключ для key-relation. Если первичный ключ составлен из нескольких столбцов, между указанными значениями вводятся пробелы. Между значениями, заданными для ключа, состоящего из нескольких столбцов, и соответствующего внешнего ключа, существует позиционное сопоставление.

  • foreign-relation
    Задает внешнее взаимоотношение (таблицу).

  • foreign-key
    Указывает внешний ключ в foreign-relation, который ссылается на key в key-relation. Если внешний ключ составлен из нескольких атрибутов (столбцов), между указанными значениями внешнего ключа вводятся пробелы. Между значениями, заданными для ключа, состоящего из нескольких столбцов, и соответствующего внешнего ключа, существует позиционное сопоставление.

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

Типы данных Microsoft SQL Server для key и foreign-key должны обеспечивать неявное преобразование в случае необходимости.

Тег sql:relationship может быть добавлен только к элементам <element> или <attribute> в аннотированной схеме. Если в атрибуте указано sql:relationship, для атрибута должны быть указаны sql:relation и sql:field, чтобы получить единственное значение (в XML недопустимы несколько атрибутов с одним именем). Если в элементе указано sql:relationship, результатом связи может стать одно значение или набор значений.

Тег sql:relationship используется, чтобы указать единственную логическую связь между двумя сущностями. Атрибуты определяют взаимоотношения и поля, используемые для определения логической связи. Несколько экземпляров sql:relationship могут быть указаны в элементе или атрибуте в аннотированной схеме, что указывает на сложную связь между элементом или атрибутом и его содержащимся элементом. Все экземпляры sql:relationship используются совместно, чтобы определить сложную связь.

Если несколько экземпляров тега sql:relationship указаны в элементе или атрибуте, то важен порядок их следования.

Заметка sql:key-fields должна быть указана в элементе, содержащем дочерний элемент и sql:relationship, определенный между элементом и потомком, который не предоставляет первичного ключа таблицы, указанной в родительском элементе. Дополнительные сведения см. в разделе Идентификация ключевых столбцов с использованием sql:key-fields (SQLXML 4.0). Чтобы правильно организовать вложенность в результатах, рекомендуется во всех схемах задавать заметку sql:key-fields.

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

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

Примеры

Чтобы создать рабочие образцы на основе следующих примеров, необходимо выполнить определенные требования. Дополнительные сведения см. в разделе Требования к запуску примеров SQLXML.

А. Укажите sql:relationship на <element>

Эта аннотированная схема XDR включает элементы <Customer> и <Order>. Элемент <Order> является дочерним для элемента <Customer>.

В схеме задана заметка sql:relationship для дочернего элемента <Order>. Заметка определяет CustomerID в таблице Sales.SalesOrderHeader как внешний ключ, ссылающийся на первичный ключ CustomerID в таблице Sales.Customer. Поэтому заказы, принадлежащие заказчику, отображаются как дочерний элемент этого элемента <Customer>.

<?xml version="1.0" ?><Schema xmlns="urn:schemas-microsoft-com:xml-data"        xmlns:dt="urn:schemas-microsoft-com:datatypes"        xmlns:sql="urn:schemas-microsoft-com:xml-sql"><ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >    <AttributeType name="CustomerID" />    <AttributeType name="SalesOrderID" />    <AttributeType name="OrderDate" />    <attribute type="CustomerID" />    <attribute type="SalesOrderID" />    <attribute type="OrderDate" /></ElementType><ElementType name="Customer" sql:relation="Sales.Customer" >    <AttributeType name="CustomerID" />    <attribute type="CustomerID" />    <element type="Order" >             <sql:relationship                      key-relation="Sales.Customer"                    key="CustomerID"                    foreign-key="CustomerID"                    foreign-relation="Sales.SalesOrderHeader" />    </element></ElementType></Schema>
ПримечаниеПримечание

В схеме сопоставления реляционные значения, такие как имя таблицы и имя столбца, учитывают регистр. Как и в предыдущем примере, Customers является значением атрибута sql:relation. Значение соответствующего атрибута key-relation также должно быть Customers.

Проверка образца запроса XPath к схеме

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как sql-relationship-xdr.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как sql-relationship-xdrT.xml в том же каталоге, в котором был сохранен файл sql-relationship-xdr.xml. Запрос в шаблоне выбирает заказчика со значением CustomerID, равным 1.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <sql:xpath-query mapping-schema="sql-relationship-xdr.xml">    Customer[@CustomerID="1"]  </sql:xpath-query></ROOT>
    

    Путь к каталогу схемы сопоставления (файл sql-relationship-xdr.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\SqlXmlTest\sql-relationship-xdr.xml"
    
  3. Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Частичный результирующий набор:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <Customer CustomerID="1">    <Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00" />     <Order CustomerID="1" SalesOrderID="44501" OrderDate="2001-11-01T00:00:00" />     <Order CustomerID="1" SalesOrderID="45283" OrderDate="2002-02-01T00:00:00" />     <Order CustomerID="1" SalesOrderID="46042" OrderDate="2002-05-01T00:00:00" />   </Customer></ROOT>

Б. Укажите sql:relationship для <attribute> и создайте ссылки на документ с использованием ID и IDREFS.

В этом примере локальные ссылки на документ указываются с использованием ID и IDREFS. Образец схемы XDR состоит из элемента <Customer>, который сопоставляется таблице Sales.Customer. Этот элемент состоит из дочернего элемента <Order>, который сопоставляется таблице Sales.SalesOrderHeader.

В данном примере sql:relationship указывается дважды:

  • sql:relationship указывается для дочернего элемента <Order>. Поэтому заказы, принадлежащие заказчику, будут отображаться как дочерний элемент этого элемента <Customer>.

  • sql:relationship также указывается для атрибута OrderIDList элемента <Customer>. Этот атрибут определяется как тип IDREFS, ссылающийся на атрибут SalesOrderID (атрибут типа ID) элемента <Order>. Поэтому sql:relationship является обязательным. В этом случае заметка sql:relationship отобразить список заказов, принадлежащих заказчику, с этим элементом <Customer>.

    Атрибуты, указанные, как IDREFS, можно использовать для ссылок на атрибуты типа ID, таким образом разрешая ссылки внутри документов.

Поскольку числа не являются допустимыми значениями ID (должны быть лексемами имени), sql:id-prefix используется, чтобы сделать Order ID строковым значением. Дополнительные сведения см. в разделе Создание допустимых атрибутов типа ID, IDREF и IDREFS с помощью sql:id-prefix (схема XDR).

<?xml version="1.0" ?><Schema xmlns="urn:schemas-microsoft-com:xml-data"        xmlns:dt="urn:schemas-microsoft-com:datatypes"        xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >    <AttributeType name="SalesOrderID" dt:type="id" sql:id-prefix="Ord-" />    <AttributeType name="OrderDate" />     <attribute type="SalesOrderID" />    <attribute type="OrderDate" />  </ElementType>  <ElementType name="Customer" sql:relation="Sales.Customer">    <AttributeType name="CustomerID"  />    <attribute type="CustomerID" />    <AttributeType name="OrderIDList" dt:type="idrefs"                                       sql:id-prefix="Ord-"/>    <attribute type="OrderIDList" sql:relation="Sales.SalesOrderHeader"                                   sql:field="SalesOrderID">                 <sql:relationship                      key-relation="Sales.Customer"                      key="CustomerID"                      foreign-relation="Sales.SalesOrderHeader"                      foreign-key="CustomerID" />    </attribute>    <element type="Order">                 <sql:relationship key-relation="Sales.Customer"                      key="CustomerID"                      foreign-relation="Sales.SalesOrderHeader"                      foreign-key="CustomerID" />    </element>  </ElementType></Schema>

Проверка образца запроса XPath к схеме

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как idIdref-xdr.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как idIdref-xdrT.xml в том же каталоге, в котором был сохранен файл idIdref-xdr.xml. Запрос в шаблоне выбирает заказчика со значением CustomerID, равным 1.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <sql:xpath-query mapping-schema="idIdref-xdr.xml">    Customer[@CustomerID="1"]  </sql:xpath-query></ROOT>
    

    Путь к каталогу для схемы сопоставления (idIdref-xdr.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\SqlXmlTest\idIdref-xdr.xml"
    
  3. Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Полученный результирующий набор показан ниже.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <Customer CustomerID="1"             OrderIDList="Ord-43860 Ord-44501 Ord-45283 Ord-46042">    <Order SalesOrderID="Ord-43860" OrderDate="2001-08-01T00:00:00" />     <Order SalesOrderID="Ord-44501" OrderDate="2001-11-01T00:00:00" />     <Order SalesOrderID="Ord-45283" OrderDate="2002-02-01T00:00:00" />     <Order SalesOrderID="Ord-46042" OrderDate="2002-05-01T00:00:00" />   </Customer></ROOT>

В. Укажите sql:relationship на нескольких элементах

В этом примере аннотированная схема XDR состоит из элементов <Customer>, <Order> и <OD>.

Элемент <Order> является дочерним элементом элемента <Customer>. sql:relationship указывается для дочернего элемента <Order>, поэтому заказы, принадлежащие заказчику, отображаются как дочерние элементы <Customer>.

Элемент <Order> содержит дочерний элемент <OD>. sql:relationship указывается для дочернего элемента <OD> , поэтому подробности заказа отображаются как дочерние элементы этого элемента <Order>.

<?xml version="1.0" ?><Schema xmlns="urn:schemas-microsoft-com:xml-data"        xmlns:dt="urn:schemas-microsoft-com:datatypes"        xmlns:sql="urn:schemas-microsoft-com:xml-sql"><ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >    <AttributeType name="SalesOrderID" />    <AttributeType name="ProductID" />    <attribute type="SalesOrderID" />    <attribute type="ProductID" /></ElementType><ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >    <AttributeType name="CustomerID" />    <AttributeType name="SalesOrderID" />    <AttributeType name="OrderDate" />    <attribute type="CustomerID" />    <attribute type="SalesOrderID" />    <attribute type="OrderDate" />    <element type="OD" >             <sql:relationship                    key-relation="Sales.SalesOrderHeader"                   key="SalesOrderID"                   foreign-key="SalesOrderID"                   foreign-relation="Sales.SalesOrderDetail" />    </element></ElementType><ElementType name="Customer" sql:relation="Sales.Customer" >    <AttributeType name="CustomerID" />    <attribute type="CustomerID" />    <element type="Order" >      <sql:relationship                 key-relation="Sales.Customer"                key="CustomerID"                foreign-key="CustomerID"                foreign-relation="Sales.SalesOrderHeader" />    </element></ElementType></Schema>

Проверка образца запроса XPath к схеме

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как sql-relationship-multi-xdr.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как sql-relationship-multi-xdrT.xml в том же каталоге, в котором был сохранен файл sql-relationship-multi-xdr.xml. Запрос в шаблоне возвращает сведения о заказчике со значением CustomerID, равным 1, и значением SalesOrderID, равным 43860.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <sql:xpath-query mapping-schema="sql-relationship-multi-xdr.xml">    /Customer[@CustomerID="1"]/Order[@SalesOrderID=43860]  </sql:xpath-query></ROOT>
    

    Путь к каталогу схемы сопоставления (файл sql-relationship-multi-xdr.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\SqlXmlTest\sql-relationship-multi-xdr.xml"
    
  3. Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Полученный результирующий набор показан ниже.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00">    <OD SalesOrderID="43860" ProductID="761" />     <OD SalesOrderID="43860" ProductID="770" />     <OD SalesOrderID="43860" ProductID="758" />     <OD SalesOrderID="43860" ProductID="765" />     <OD SalesOrderID="43860" ProductID="732" />     <OD SalesOrderID="43860" ProductID="762" />     <OD SalesOrderID="43860" ProductID="738" />     <OD SalesOrderID="43860" ProductID="768" />     <OD SalesOrderID="43860" ProductID="753" />     <OD SalesOrderID="43860" ProductID="729" />     <OD SalesOrderID="43860" ProductID="763" />     <OD SalesOrderID="43860" ProductID="756" />   </Order></ROOT>

Г. Укажите косвенные связи

В этом примере аннотированная схема XDR состоит из элементов <Customer> и <OD>. Связь между этими элементами — косвенная (таблица Sales.Customer table связана с таблицей Sales.SalesOrderDetail через таблицу Sales.SalesOrderHeader). Чтобы сопоставить заказчика со сведениями о заказах, сначала необходимо указать связь между таблицей Sales.Customer и Sales.SalesOrderHeader. Затем указывается связь между таблицами Sales.SalesOrderHeader и Sales.SalesOrderDetail.

Схема:

<?xml version="1.0" ?><Schema xmlns="urn:schemas-microsoft-com:xml-data"        xmlns:dt="urn:schemas-microsoft-com:datatypes"        xmlns:sql="urn:schemas-microsoft-com:xml-sql"><ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >    <AttributeType name="SalesOrderID" />    <AttributeType name="ProductID" />    <AttributeType name="UnitPrice" />    <attribute type="SalesOrderID" />    <attribute type="ProductID" />    <attribute type="UnitPrice" /></ElementType><ElementType name="Customer" sql:relation="Sales.Customer" >    <AttributeType name="CustomerID" />    <attribute type="CustomerID" />    <element type="OD" >             <sql:relationship                     key-relation="Sales.Customer"                    key="CustomerID"                    foreign-relation="Sales.SalesOrderHeader"                    foreign-key="CustomerID"/>             <sql:relationship                     key-relation="Sales.SalesOrderHeader"                    key="SalesOrderID"                    foreign-relation="Sales.SalesOrderDetail"                     foreign-key="SalesOrderID" />    </element></ElementType></Schema>

Проверка образца запроса XPath к схеме

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как indirect-relationship-xdr.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как sql-relationship-xdrT.xml в том же каталоге, в котором был сохранен файл sql-relationship-xdr.xml. Запрос в шаблоне возвращает сведения о заказах со значением CustomerID, равным 1.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" ><sql:xpath-query mapping-schema="indirect-relationship-xdr.xml" >/Customer[@CustomerID="1"]</sql:xpath-query></ROOT>
    

    Путь к каталогу схемы сопоставления (файл indirect-relationship-xdr.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\SqlXmlTest\indirect-relationship-xdr.xml"
    
  3. Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Частичный результат:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <Customer CustomerID="1">    <OD SalesOrderID="43860" ProductID="761" UnitPrice="503.3507" />     <OD SalesOrderID="43860" ProductID="770" UnitPrice="503.3507" />     <OD SalesOrderID="43860" ProductID="758" UnitPrice="1049.7528" />     <OD SalesOrderID="43860" ProductID="765" UnitPrice="503.3507" />     ...  </Customer>  </ROOT>

Д. Укажите многоключевые соединительные связи

Указывая соединение с использованием sql:relationship, можно указать соединение, включающее два и более столбцов. В этом случае имена столбцов для key и foreign-key перечислены с использованием пробела.

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

  • dbo.Cust (fname, lname)

  • dbo.Ord (OrderID, fname, lname)

Столбцы fname и lname из первичного ключа таблицы Cust. OrderID — первичный ключ таблицы Ord. fname и lname в таблице Ord — внешние ключи, которые ссылаются на первичный ключ lname в таблице Cust.

Эта схема состоит из элементов <Cust> и <Ord>. sql:relationship используется для их соединения.

<?xml version="1.0" ?><Schema xmlns="urn:schemas-microsoft-com:xml-data"        xmlns:dt="urn:schemas-microsoft-com:datatypes"        xmlns:sql="urn:schemas-microsoft-com:xml-sql"><ElementType name="Ord" sql:relation="Ord" >    <AttributeType name="OrderID" />    <attribute type="OrderID" /></ElementType><ElementType name="Cust" sql:relation="Cust" >    <AttributeType name="fname" />    <AttributeType name="lname" />    <attribute type="fname" />    <attribute type="lname" />    <element type="Ord" >             <sql:relationship                     key-relation="Cust"                    key="fname lname"                    foreign-relation="Ord"                    foreign-key="fname lname"/>    </element></ElementType></Schema>

Проверка образца запроса XPath к схеме

  1. Создайте две таблицы: Cust и Ord.

    USE tempdbCREATE TABLE dbo.Cust(       fname  varchar(20),        lname   varchar(20)       )CREATE TABLE dbo.Ord (       OrderID int primary key,        fname  varchar(20),        lname   varchar(20)       )GO
    
  2. Добавьте следующий образец данных:

    INSERT INTO Cust values ('Nancy', 'Davolio')INSERT INTO Cust values('Andrew', 'Fuller')INSERT INTO Ord values (1,'Nancy', 'Davolio')INSERT INTO Ord values (2,'Nancy', 'Davolio')INSERT INTO Ord values (3,'Andrew', 'Fuller')
    
  3. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как imultikey-join-xdr.xml.

  4. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как multikey-join-xdrT.xml в том же каталоге, в котором был сохранен файл multikey-join-xdr.xml. Запрос в шаблоне сведения о заказчике.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" >  <sql:xpath-query mapping-schema="multikey-join-xdr.xml" >    /Cust  </sql:xpath-query></ROOT>
    

    Путь к каталогу схемы сопоставления (файл multikey-join-xdr.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\SqlXmlTest\multikey-join-xdr.xml"
    
  5. Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Частичный результат:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">   <Cust fname="Andrew" lname="Fuller">     <Ord OrderID="3" />   </Cust>   <Cust fname="Nancy" lname="Davolio">     <Ord OrderID="1" />     <Ord OrderID="2" />   </Cust> </ROOT>