使用 sql:limit-field 和 sql:limit-value 筛选值(XDR 架构)
重要提示 |
---|
本主题是针对早期应用程序提供的参考,以后不会就该功能继续进行开发。请避免在新的开发工作中使用此功能,而应使用带批注的 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-field。
sql:limit-value 批注用于指定在 sql:limit-field 批注所指定的列中的限制值。此批注是可选的。如果未指定 sql:limit-value,将采用 Null 值。
注意 |
---|
使用 sql:limit-field(其中映射的 SQL 列为 float 和 real (Transact-SQL) 类型)时,SQLXML 4.0 对 sql:limit-value 执行转换(如作为 nchar 和 nvarchar (Transact-SQL) 指定值在 XML 架构中指定)。这要求使用纯科学记数法指定小数限制值。有关详细信息,请参阅下面的示例 B。 |
示例
若要创建使用以下示例的工作示例,必须满足某些要求。有关详细信息,请参阅运行 SQLXML 示例的要求。
A. 将返回的客户地址限制为特定地址类型
在此示例中,数据库包含两个表:
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 查询
在 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 2222México D.F.', 'shipping') INSERT INTO Addresses values (2, '120 Hanover Sq., London', 'billing') INSERT INTO Addresses values (2, 'Forsterstr. 57, Mannheim', 'shipping')
复制上面的架构代码,并将它粘贴到文本文件中。将该文件另存为 LimitFieldValueXdr.xml。
复制以下模板,并将它粘贴到文本文件中。在保存 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"
创建并使用 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. 基于 real 数据类型的折扣值限制结果
在此示例中,数据库包含两个表:
Orders (OrderID)
OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Price, Discount)
这是将 order details 的 OrderID 属性映射到 orders 关系中的 OrderID 列的映射架构。使用 sql:limit-field 和 sql:limit-value 批注将此属性的返回值限制为值 2.0000000e-001 (0.2)(即为 Discount 属性指定的值)。
以下是架构:
<?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 查询
在 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}" '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"
通过在 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>