Задание связей с помощью 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 к схеме
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как sql-relationship-xdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как 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"
Создайте и запустите тестовый сценарий 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 к схеме
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как idIdref-xdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как 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"
Создайте и запустите тестовый сценарий 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 к схеме
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как sql-relationship-multi-xdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как 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"
Создайте и запустите тестовый сценарий 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 к схеме
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как indirect-relationship-xdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как 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"
Создайте и запустите тестовый сценарий 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 к схеме
Создайте две таблицы: 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
Добавьте следующий образец данных:
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')
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как imultikey-join-xdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл как 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"
Создайте и запустите тестовый сценарий 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>