sql:limit-field および sql:limit-value を使用した、値のフィルタ選択 [SQLXML 4.0]
データベース クエリから返される行を、一定の制限値に基づいて制限することができます。制限の対象となるデータベース列を識別し、返されるデータのフィルタ選択に使用する制限値を指定するには、sql:limit-field 注釈と sql:limit-value 注釈を使用します。
sql:limit-field 注釈では、制限の対象となる列を指定します。この注釈は、マップされる要素または属性ごとに使用できます。
sql:limit-value 注釈では、sql:limit-field 注釈で指定された列に適用する制限値を指定します。sql:limit-value 注釈は省略可能です。sql:limit-value を指定しない場合は、NULL 値が使用されます。
メモ : |
---|
マップされる SQL 列が real 型の場合に sql:limit-field を指定すると、SQLXML 4.0 では XML スキーマで指定されているとおり、nvarchar 指定値として sql:limit-value が変換されます。ここで、10 進数の制限値を完全な科学的表記法で指定する必要があります。詳細については、後の例 B を参照してください。 |
例
次の例を使用して実際のサンプルを作成するには、次がインストールされている必要があります。
- Microsoft SQL Native Client
- MDAC 2.6 以降
これらの例では、テンプレートを使用して、マッピング XSD スキーマに対する XPath クエリを指定します。
A. 返される顧客の住所を特定の住所タイプに制限する
この例では、データベースに次の 2 つのテーブルが含まれています。
- Customer (CustomerID, CompanyName)
- Addresses (CustomerID, AddressType, StreetAddress)
顧客には、発送先住所と請求先住所のいずれかまたは両方が設定されています。AddressType 列の値は Shipping と Billing です。
このマッピング スキーマでは、ShipTo スキーマ属性が Addresses リレーションの StreetAddress 列にマップされます。sql:limit-field 注釈と sql:limit-value 注釈を指定することにより、この属性には発送先住所だけが返されます。同様に、BillTo スキーマ属性には請求先住所だけが返されます。
スキーマは次のようになります。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustAddr"
parent="Customer"
parent-key="CustomerID"
child="Addresses"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer" sql:relation="Customer" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="BillTo"
type="xsd:string"
sql:relation="Addresses"
sql:field="StreetAddress"
sql:limit-field="AddressType"
sql:limit-value="billing"
sql:relationship="CustAddr" >
</xsd:element>
<xsd:element name="ShipTo"
type="xsd:string"
sql:relation="Addresses"
sql:field="StreetAddress"
sql:limit-field="AddressType"
sql:limit-value="shipping"
sql:relationship="CustAddr" >
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:int" />
<xsd:attribute name="CompanyName" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
スキーマに対してサンプル XPath クエリをテストするには
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))
サンプル データを追加します。
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 2222 México D.F.', 'shipping') INSERT INTO Addresses values (2, '120 Hanover Sq., London', 'billing') INSERT INTO Addresses values (2, 'Forsterstr. 57, Mannheim', 'shipping')
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、LimitFieldValue.xml として保存します。
次のテンプレート (LimitFieldValueT.xml) を作成し、前の手順でスキーマ (LimitFieldValue.xml) を保存した場所に保存します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="LimitFieldValue.xml"> /Customer </sql:xpath-query> </ROOT>
マッピング スキーマ (LimitFieldValue.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\LimitFieldValue.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1" CompanyName="Company A">
<BillTo>Obere Str. 57 Berlin</BillTo>
<ShipTo>Avda. de la Constitución 2222 México D.F.</ShipTo>
</Customer>
<Customer CustomerID="2" CompanyName="Company B">
<BillTo>120 Hanover Sq., London</BillTo>
<ShipTo>Forsterstr. 57, Mannheim</ShipTo>
</Customer>
</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 だけが返されます。
スキーマは次のようになります。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrderOrderDetails"
parent="Orders"
parent-key="OrderID"
child="OrderDetails"
child-key="OrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="root" sql:is-constant="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Order" sql:relation="Orders" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="orderDetail"
sql:relation="OrderDetails"
sql:limit-field="Discount"
sql:limit-value="2.0000000e-001"
sql:relationship="OrderOrderDetails">
<xsd:complexType>
<xsd:attribute name="OrderID" />
<xsd:attribute name="ProductID" />
<xsd:attribute name="Discount" />
<xsd:attribute name="Quantity" />
<xsd:attribute name="UnitPrice" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="OrderID"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
スキーマに対してサンプル XPath クエリをテストするには
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]
サンプル データを追加します。
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)
スキーマ (LimitFieldValue.xml) をディレクトリに保存します。
次のテスト スクリプト (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}" 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"
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>
参照
関連項目
クエリでの注釈付き XSD スキーマの使用 (SQLXML 4.0)
その他の技術情報
float 型と real 型 (Transact-SQL)
nchar および nvarchar (Transact-SQL)
SQL Native Client によるアプリケーションの配置