次の方法で共有


sql:limit-field および sql:limit-value を使用した、値のフィルタ選択 (XDR スキーマ)

ms172648.note(ja-jp,SQL.90).gif重要 :
このトピックは、レガシ アプリケーションの参照用として用意されています。この機能は今後更新されません。新しい開発作業では、この機能の使用を避け、注釈付き XSD スキーマを使用して XML ビューを作成してください。詳細については、「注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。既存の注釈付き XDR スキーマは、XSD スキーマに変換できます。詳細については、「注釈付き XDR スキーマから同等の XSD スキーマへの変換 (SQLXML 4.0)」を参照してください。

データベース クエリから返される行を、一定の制限値に基づいて制限することができます。制限の対象となるデータベース列と、返されるデータのフィルタ選択に使用する制限値を指定するには、次の注釈を使用します。

sql:limit-field 注釈。制限の対象となる列を指定します。sql:limit-field は、<sql:relationship> で指定される結合リレーションシップを修飾するときに使用し、<sql:relationship> が指定されている要素または属性に指定する必要があります。

sql:limit-value 注釈。sql:limit-field 注釈で指定された列に適用する制限値を指定します。この注釈は省略可能です。sql:limit-value を指定しない場合は、NULL 値が使用されます。

ms172648.note(ja-jp,SQL.90).gifメモ :
マップされる SQL 列が float 型と real 型 (Transact-SQL) 型の場合に sql:limit-field を指定すると、SQLXML 4.0 では XML スキーマで指定されているとおり、nchar および nvarchar (Transact-SQL) 指定値として sql:limit-value が変換されます。ここで、10 進数の制限値を完全な科学的表記法で指定する必要があります。詳細については、後の例 B を参照してください。

次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。

A. 返される顧客住所を特定の住所タイプに制限する

この例では、データベースに次の 2 つのテーブルが含まれています。

  • Customer (CustomerID, CompanyName)
  • Addresses (CustomerID, AddressType, StreetAddress)

顧客には、発送先住所と請求先住所のいずれかまたは両方が設定されています。AddressType 列の値は Shipping と Billing です。

このマッピング スキーマでは、ShipTo スキーマ属性が Addresses リレーションの StreetAddress 列にマップされます。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 データベース内に次の 2 つのテーブルを作成します。

    USE tempdb
    CREATE 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 Constitución 2222México D.F.', 'shipping')
    INSERT INTO Addresses values
                (2, '120 Hanover Sq., London', 'billing')
    INSERT INTO Addresses values
                (2, 'Forsterstr. 57, Mannheim', 'shipping')
    
  3. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、LimitFieldValueXdr.xml として保存します。

  4. 次のテンプレートをコピーして、テキスト ファイルに貼り付け、LimitFieldValueXdr.xml を保存したディレクトリに LimitFieldValueXdrT.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 Constitución 2222México D.F." /> 
  <Customer CustomerID="2" CompanyName="Company B" 
          BillTo="120 Hanover Sq., London" 
          ShipTo="Forsterstr. 57, Mannheim" /> 
</ROOT>

B. 実数型データのディスカウント値に基づいて結果を制限する

この例では、データベースに次の 2 つのテーブルが含まれています。

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

このマッピング スキーマでは、OrderDetails の OrderID 属性が orders リレーションの OrderID 列にマップされます。sql:limit-field 注釈と sql:limit-value 注釈を指定することにより、この属性には Discount 属性で値 2.0000000e-001 (0.2) が指定されている ID だけが返されます。

スキーマは次のようになります。

<?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 データベース内に次の 2 つのテーブルを作成します。

    USE tempdb
    CREATE 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) を作成し、"MyServer" を使用している 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 = conn
    stm.open
    result ="none"
    strXPathQuery="/root"
    DBGUID_XPATH = "{EC2A4293-E898-11D2-B1B7-00C04F680C56}"
    'DBGUID_MSSQLXML = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"
    cmd.Dialect = DBGUID_XPATH
    cmd.CommandText = strXPathQuery
    cmd.Properties("Mapping schema") = "LimitFieldReal.xml"
    cmd.Properties("Output Stream").Value = stm
    cmd.Properties("Output Encoding") = "utf-8"
    WScript.Echo "executing for xml query"
    On Error Resume Next
    cmd.Execute , ,1024
    if err then
    Wscript.Echo err.description
    Wscript.Echo err.Number
    Wscript.Echo err.source
    On Error GoTo 0
    else
    stm.Position = 0
    result  = stm.ReadText
    end if
    WScript.Echo result
    Wscript.Echo "done"
    
  5. Windows エクスプローラで TestQuery.vbs ファイルをクリックして実行します。

    次に結果セットを示します。

    <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>
    

参照

関連項目

SQLXML 4.0 での XPath クエリの使用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手