使用 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:limit-field (其中對應的 SQL 資料行屬於 real 類型) 時,SQLXML 4.0 會針對 XML 結構描述中指定的 sql:limit-value 執行轉換,做為 nvarchar 指定的值。這需要使用完整的科學記號標記法指定十進位限制值。如需詳細資訊,請參閱下列範例 B。
範例
若要使用這些範例建立工作範例,您必須已經安裝下列項目:
Microsoft SQL Server Native Client
MDAC 2.6 或更新版本
在這些範例中,這些範本用於針對對應 XSD 結構描述指定 XPath 查詢。
A. 將傳回的客戶地址限制為特定的地址類型
在這個範例中,資料庫包含兩個資料表:
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] 資料庫中建立兩個資料表:
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. 根據實數資料類型的折扣值限制結果
在這個範例中,資料庫包含兩個資料表:
Orders (OrderID)
OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Price, Discount)
這是對應的結構描述,其中訂單詳細資料上的 OrderID 屬性會對應到 orders 關聯中的 OrderID 資料行。針對此屬性傳回的值會僅限於值為 2.0000000e-001 (0.2) 的值,如同使用 sql:limit-field 和 sql:limit-value 註解,針對 Discount 屬性所指定。
這是結構描述:
<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] 資料庫中建立兩個資料表:
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>