Использование схем XSD с заметками в запросах (SQLXML 4.0)

Применимо к:база данных SQL ServerAzure SQL

Для получения данных из базы данных путем указания запроса XPath в шаблоне к схеме XSD можно задавать запросы к аннотированным схемам.

Элемент <sql:xpath-query> позволяет указать запрос XPath к XML-представлению, определенному схемой с заметками. Схема с заметками, для которой выполняется запрос XPath, определяется с помощью атрибута <mapping-schema элемента sql:xpath-query>.

Шаблоны являются допустимыми XML-документами, которые содержат один или несколько запросов. Запросы FOR XML и XPath возвращают фрагмент документа. Шаблоны выполняют функцию контейнеров для фрагментов документов. Таким образом, они обеспечивают возможность указания единственного элемента верхнего уровня.

В примерах из этого раздела шаблоны задают запрос XPath по схеме с заметками для получения данных из базы данных.

В качестве примера рассмотрим следующую аннотированную схему.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:element name="Person.Contact" >  
     <xsd:complexType>  
       <xsd:attribute name="ContactID" type="xsd:string" />   
       <xsd:attribute name="FirstName" type="xsd:string" />   
       <xsd:attribute name="LastName"  type="xsd:string" />   
     </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  

Для иллюстрации эта схема XSD хранится в файле Schema2.xml. Затем можно выполнить запрос XPath к аннотированной схеме, определенной в следующем файле шаблона (Schema2T.xml).

<sql:xpath-query   
     xmlns:sql="urn:schemas-microsoft-com:xmlsql"  
     >  
          Person.Contact[@ContactID="1"]  
</sql:xpath-query>  

Затем можно создать и запустить тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить запрос, содержащийся в файле шаблона. Дополнительные сведения см. в статье Схемы XDR с заметками (нерекомендуемые в SQLXML 4.0).

Использование встроенных схем сопоставления

Аннотированную схему можно включить непосредственно в шаблон, а затем выполнить определенный в шаблоне запрос XPath к встроенной схеме. Шаблон может также быть диаграммой обновления.

Шаблон может включать несколько встроенных схем. Чтобы использовать встроенную схему, включенную в шаблон, укажите атрибут id с уникальным значением в элементе <xsd:schema> , а затем используйте #idvalue для ссылки на встроенную схему. Атрибут id по поведению идентичен идентификатору sql:id ({urn:schemas-microsoft-com:xml-sql}id), используемому в схемах XDR.

Например, следующий шаблон определяет две встроенные аннотированные схемы.

<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'>  
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'  
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'  
        id='InLineSchema1' sql:is-mapping-schema='1'>  
  <xsd:element name='Employees' ms:relation='HumanResources.Employee'>  
    <xsd:complexType>  
      <xsd:attribute name='LoginID'   
                     type='xsd:string'/>  
      <xsd:attribute name='Title'   
                     type='xsd:string'/>  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
  
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'  
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'  
        id='InLineSchema2' sql:is-mapping-schema='1'>  
  <xsd:element name='Contacts' ms:relation='Person.Contact'>  
    <xsd:complexType>  
  
      <xsd:attribute name='ContactID'   
                     type='xsd:string' />  
      <xsd:attribute name='FirstName'   
                     type='xsd:string' />  
      <xsd:attribute name='LastName'   
                     type='xsd:string' />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
  
<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql'   
        mapping-schema='#InLineSchema1'>  
    /Employees[@LoginID='adventure-works\guy1']  
</sql:xpath-query>  
  
<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql'   
        mapping-schema='#InLineSchema2'>  
    /Contacts[@ContactID='1']  
</sql:xpath-query>  
</ROOT>  

В шаблоне также задано два запроса XPath. Каждый из <элементов xpath-query> однозначно идентифицирует схему сопоставления путем указания атрибута mapping-schema .

При указании встроенной схемы в шаблоне заметка sql:is-mapping-schema также должна быть указана в элементе <xsd:schema> . Sql :is-mapping-schema принимает логическое значение (0=false, 1=true). Встроенная схема с sql:is-mapping-schema="1" обрабатывается как встроенная аннотированная схема и не возвращается в XML-документе.

Заметка sql:is-mapping-schema принадлежит пространству имен шаблона urn:schemas-microsoft-com:xml-sql.

Чтобы протестировать этот пример, сохраните шаблон (InlineSchemaTemplate.xml) в локальном каталоге, а затем создайте и выполните тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs) для запуска шаблона. Дополнительные сведения см. в статье Использование ADO для выполнения запросов SQLXML 4.0.

Помимо указания атрибута mapping-schema в элементе <sql:xpath-query> в шаблоне (при наличии запроса XPath) или в элементе <updg:sync> в диаграмме обновления можно сделать следующее:

  • Укажите атрибут mapping-schema в элементе <ROOT> (глобальном объявлении) в шаблоне. Затем эта схема сопоставления становится схемой по умолчанию, которая будет использоваться всеми узлами XPath и диаграммы обновления без явной заметки схемы сопоставления .

  • Укажите атрибут схемы сопоставления с помощью объекта ADO Command .

Атрибут mapping-schema, указанный в элементе <xpath-query> или <updg:sync>, имеет наивысший приоритет, а объект ADO Command имеет наименьший приоритет.

Обратите внимание, что если вы указываете запрос XPath в шаблоне и не указываете схему сопоставления, для которой выполняется запрос XPath, запрос XPath обрабатывается как запрос типа dbobject . Например, рассмотрим следующий шаблон.

<sql:xpath-query   
     xmlns:sql="urn:schemas-microsoft-com:xmlsql">  
          Production.ProductPhoto[@ProductPhotoID='100']/@LargePhoto  
</sql:xpath-query>  

В шаблоне определяется запрос XPath, но не задаются схемы сопоставления. Таким образом, этот запрос рассматривается как запрос типа dbobject , в котором Production.ProductPhoto — имя таблицы, а @ProductPhotoID=«100» — это предикат, который находит фотографию продукта со значением идентификатора 100. @LargePhoto — это столбец, из которого извлекается значение.