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


Фильтрация значений при помощи sql:limit-field и sql:limit-value (схема XDR)

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

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

Можно ограничить количество строк, возвращаемых запросом к базе данных, на основе ограничительного значения. Эти заметки используются для определения столбца базы данных, содержащего ограничительные значения, и указания особого ограничительного значения для фильтрации возвращаемых данных.

Заметка sql:limit-field используется для определения столбца, содержащего ограничительное значение. sql:limit-field используется для уточнения отношения объединения, заданного с помощью <sql:relationship>. sql:limit-field необходимо использовать в элементе или атрибуте с заданным <sql:relationship>.

Заметка sql:limit-value используется для указания ограничивающего значения в столбце, заданном в заметке sql:limit-field. Эта заметка необязательна. Если sql:limit-value не указана, предполагается значение NULL.

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

При работе с заметкой sql:limit-field, где сопоставляемый столбец SQL имеет тип Типы данных float и real (Transact-SQL), SQLXML 4.0 выполняет преобразование значения sql:limit-value, указанного в схемах XML, как значение типа nchar и nvarchar (Transact-SQL). Для этого необходимо, чтобы десятичные граничные значения были указаны в полном экспоненциальном представлении. Дополнительные сведения см. в приведенном ниже Примере Б.

Примеры

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

A. Ограничение адресов заказчиков, возвращаемых для конкретного типа адреса

В этом примере база данных содержит две таблицы:

  • Customer (CustomerID, CompanyName)

  • Addresses (CustomerID, AddressType, StreetAddress)

Заказчик может иметь адрес для выставления счетов и адрес для доставки (значения столбца AddressType – Billing и Shipping).

Ниже представлена схема сопоставления, в которой атрибут схемы ShipTo сопоставляется со столбцом StreetAddress в отношении Addresses. Значения, возвращаемые для этого атрибута, ограничиваются адресами доставки путем указания заметок sql:limit-field и sql:limit-value. Точно так же атрибут схемы BillTo возвращает только адреса выставления счетов заказчика.

Схема:

<?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="Customer" sql:relation="Customer" >    <AttributeType name="CustomerID" />    <AttributeType name="CompanyName" />    <AttributeType name="BillTo" />    <AttributeType name="ShipTo" />    <attribute type="CustomerID" />    <attribute type="CompanyName" />    <attribute type="BillTo"                 sql:limit-field="AddressType"                sql:limit-value="billing"                sql:field="StreetAddress"                sql:relation="Addresses" >                <sql:relationship                         key="CustomerID"                        key-relation="Customer"                       foreign-relation="Addresses"                       foreign-key="CustomerID" />    </attribute>    <attribute type="ShipTo"                 sql:limit-field="AddressType"                sql:limit-value="shipping"                sql:field="StreetAddress"                sql:relation="Addresses" >                <sql:relationship                      key="CustomerID"                     key-relation="Customer"                     foreign-relation="Addresses"                     foreign-key="CustomerID" />    </attribute></ElementType></Schema>

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

  1. В базе данных tempdb создайте две следующие таблицы:

    USE tempdbCREATE TABLE Customer (CustomerID int primary key,                        CompanyName varchar(30))CREATE TABLE Addresses(CustomerID int,                        StreetAddress varchar(50),                       AddressType varchar(10))
    
  2. Добавьте образцы данных:

    INSERT INTO Customer values (1, 'Company A')INSERT INTO Customer values (2, 'Company B')INSERT INTO Addresses values            (1, 'Obere Str. 57 Berlin', 'billing')INSERT INTO Addresses values            (1, 'Avda. de la Constitucion 2222Mexico D.F.', 'shipping')INSERT INTO Addresses values            (2, '120 Hanover Sq., London', 'billing')INSERT INTO Addresses values            (2, 'Forsterstr. 57, Mannheim', 'shipping')
    
  3. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем LimitFieldValueXdr.vbs.

  4. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл с именем LimitFieldValueXdrT в том же каталоге, где был сохранен файл LimitFieldValueXdr.xml. Запрос шаблона выбирает все записи в таблице Customer.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <sql:xpath-query mapping-schema="LimitFieldValueXdr.xml">    /Customer  </sql:xpath-query></ROOT>
    

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

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

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

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

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">   <Customer CustomerID="1" CompanyName="Company A"           BillTo="Obere Str. 57 Berlin"           ShipTo="Avda. de la Constitucion 2222Mexico D.F." />   <Customer CustomerID="2" CompanyName="Company B"           BillTo="120 Hanover Sq., London"           ShipTo="Forsterstr. 57, Mannheim" /> </ROOT>

Б. Ограничение результатов на основе значения скидки, имеющего тип данных real

В этом примере база данных содержит две таблицы:

  • Orders (OrderID)

  • OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Price, Discount)

Ниже приводится схема сопоставления, в которой атрибут OrderID в сведениях о заказах сопоставляется со столбцом OrderID в отношении orders. Для этого атрибута возвращаются только значения 2.0000000e-001 (0.2), как задано для атрибута Discount с помощью заметок sql:limit-field и sql:limit-value.

Схема:

<?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="root" sql:is-constant="1">    <element type="Order"/>  </ElementType>  <ElementType name="orderDetail" sql:relation="OrderDetails">     <AttributeType name="OrderID" />     <AttributeType name="ProductID" />     <AttributeType name="Discount" />     <AttributeType name="Quantity" />     <attribute type="OrderID" />     <attribute type="ProductID" />     <attribute type="Discount" />     <attribute type="Quantity" />  </ElementType>  <ElementType name="Order" sql:relation="Orders">     <AttributeType name="OrderID"/>     <attribute type="OrderID"/>     <element type="orderDetail"                sql:limit-field="Discount"               sql:limit-value="2.0000000e-001">        <sql:relationship key="OrderID"                          key-relation="Orders"                          foreign-relation="OrderDetails"                          foreign-key="OrderID"/>     </element>  </ElementType></Schema>

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

  1. В базе данных tempdb создайте две таблицы:

    USE tempdbCREATE TABLE Orders ([OrderID] int NOT NULL ) ON [PRIMARY]ALTER TABLE Orders WITH NOCHECK ADD CONSTRAINT [PK_Orders] PRIMARY KEY  CLUSTERED (   [OrderID] )  ON [PRIMARY] CREATE TABLE [OrderDetails] (   [OrderID] int NOT NULL ,   [ProductID] int NOT NULL ,   [UnitPrice] money NULL ,   [Quantity] smallint NOT NULL ,   [Discount] real NOT NULL ) ON [PRIMARY]
    
  2. Добавьте образцы данных:

    INSERT INTO Orders ([OrderID]) values (10248)INSERT INTO Orders ([OrderID]) values (10250)INSERT INTO Orders ([OrderID]) values (10251)INSERT INTO Orders ([OrderID]) values (10257)INSERT INTO Orders ([OrderID]) values (10258)INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10248,11,14,12,0)INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10250,51,42.4,35,0.15)INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10251,22,16.8,6,0.05)INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10257,77,10.4,15,0)INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10258,2,15.2,50,0.2)
    
  3. Сохраните схему (LimitFieldValue.xml) в каталоге.

  4. Создайте следующий сценарий проверки (TestQuery.vbs), замените МойСервер на имя компьютера с SQL Server и сохраните его в том же каталоге, в котором на предыдущем шаге была сохранена схема.

    Set conn = CreateObject("ADODB.Connection")conn.Open "Provider=SQLOLEDB;Data Source=MyServer;Database=tempdb;Integrated Security=SSPI"conn.Properties("SQLXML Version") = "sqlxml.4.0" Set cmd = CreateObject("ADODB.Command")Set stm = CreateObject("ADODB.Stream")Set cmd.ActiveConnection = connstm.openresult ="none"strXPathQuery="/root"DBGUID_XPATH = "{EC2A4293-E898-11D2-B1B7-00C04F680C56}"'DBGUID_MSSQLXML = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"cmd.Dialect = DBGUID_XPATHcmd.CommandText = strXPathQuerycmd.Properties("Mapping schema") = "LimitFieldReal.xml"cmd.Properties("Output Stream").Value = stmcmd.Properties("Output Encoding") = "utf-8"WScript.Echo "executing for xml query"On Error Resume Nextcmd.Execute , ,1024if err thenWscript.Echo err.descriptionWscript.Echo err.NumberWscript.Echo err.sourceOn Error GoTo 0elsestm.Position = 0result  = stm.ReadTextend ifWScript.Echo resultWscript.Echo "done"
    
  5. Запустите файл TestQuery.vbs, щелкнув его в проводнике Windows.

    Результирующий набор:

    <root>  <Order OrderID="10248"/>  <Order OrderID="10250"/>  <Order OrderID="10251"/>  <Order OrderID="10257"/>  <Order OrderID="10258">    <orderDetail OrderID="10258"                  ProductID="2"                  Discount="0.2"                  Quantity="50"/>  </Order></root>