Filtrando valores usando sql:limit-field e sql:limit-value (esquema XDR)
Importante |
---|
Este tópico está incluso como referência para aplicativos herdados. Não será feito nenhum trabalho de desenvolvimento futuro nesse recurso. Evite usá-lo em novos trabalhos de desenvolvimento. Em vez disso, use esquemas XSD anotados para criar exibições XML. Para obter mais informações, consulte Introdução a esquemas XSD anotados (SQLXML 4.0). Você pode converter esquemas XDR anotados existentes em esquemas XSD. Para obter mais informações, consulte Convertendo esquemas XDR anotados a esquemas XSD equivalentes (SQLXML 4.0). |
Você pode limitar as linhas retornadas de uma consulta de banco de dados com base em algum valor limitador. Essas anotações são usadas para identificar a coluna de banco de dados que contém os valores limitadores e especificar um valor limitador específico a ser usado para filtrar os dados retornados.
A anotação sql:limit-field é usada para identificar uma coluna que contém um valor limitador. sql:limit-field é usado para qualificar o relacionamento de junção especificado usando <sql:relationship>. sql:limit-field precisa ser usado em um elemento ou atributo que tem <sql:relationship> especificado.
A anotação sql:limit-value é usada para especificar o valor limitado na coluna especificada em uma anotação sql:limit-field. Essa anotação é opcional. Se sql:limit-value não for especificado, um valor nulo será assumido.
Observação |
---|
Ao trabalhar com um sql:limit-field onde a coluna SQL mapeada é do tipo flutuante e real (Transact-SQL), o SQLXML 4.0 executa a conversão no sql:limit-value conforme especificado em esquemas XML como um valor especificado por nchar e nvarchar (Transact-SQL). Isso exige que os valores de limite decimal sejam especificados usando notação científica completa. Para obter mais informações, veja o Exemplo B a seguir. |
Exemplos
Para criar exemplos de funcionamento usando os exemplos a seguir, é necessário atender a determinados requisitos. Para obter mais informações, consulte Requisitos para executar exemplos do SQLXML.
A. Limitar os endereços de cliente retornados para um tipo de endereço específico
Neste exemplo, um banco de dados contém duas tabelas:
Customer (CustomerID, CompanyName)
Addresses (CustomerID, AddressType, StreetAddress)
Um cliente pode ter um endereço para cobrança e/ou um endereço para entrega (os valores da coluna AddressType são Shipping e Billing).
Este é o esquema de mapeamento no qual o atributo de esquema ShipTo é mapeado para a coluna StreetAddress na relação Addresses. Os valores retornados para esse atributo são limitados somente aos endereços para Entrega especificando as anotações sql:limit-field e sql:limit-value. De maneira semelhante, o atributo de esquema BillTo retorna somente o endereço para Cobrança de um cliente.
Este é o esquema:
<?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>
Para testar uma consulta XPath de exemplo com relação ao esquema
Crie as duas tabelas a seguir no banco de dados tempdb:
USE tempdb CREATE TABLE Customer (CustomerID int primary key, CompanyName varchar(30)) CREATE TABLE Addresses(CustomerID int, StreetAddress varchar(50), AddressType varchar(10))
Adicione os dados de exemplo:
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')
Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como LimitFieldValueXdr.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como LimitFieldValueXdrT.xml no mesmo diretório em que você salvou LimitFieldValueXdrT.xml. A consulta no modelo seleciona todos os registros na tabela Customer.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="LimitFieldValueXdr.xml"> /Customer </sql:xpath-query> </ROOT>
O caminho de diretório especificado para o esquema de mapeamento (LimitFieldValueXdr.xml) é relativo ao diretório em que o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\MyDir\LimitFieldValueXdr.xml"
Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.
Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.
A seguir está o conjunto de resultados:
<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. Limitar os resultados com base em um valor de desconto de dados de tipos reais
Neste exemplo, um banco de dados contém duas tabelas:
Orders (OrderID)
OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Price, Discount)
Este é o esquema de mapeamento no qual o atributo OrderID dos detalhes do pedido é mapeado para a coluna OrderID na relação de pedidos. Os valores retornados para esse atributo são limitados somente àqueles que têm um valor de 2.0000000e-001 (0.2) conforme especificado para o atributo Discount usando as anotações sql:limit-field e sql:limit-value.
Este é o esquema:
<?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>
Para testar uma consulta XPath de exemplo com relação ao esquema
Crie duas tabelas no banco de dados 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]
Adicione os dados de exemplo:
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)
Salve o esquema (LimitFieldValue.xml) em um diretório.
Crie o script de teste (TestQuery.vbs) a seguir, modifique MyServer para o nome do computador SQL Server e salve-o no mesmo diretório que você usou na etapa anterior para salvar o esquema:
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"
Execute o arquivo TestQuery.vbs clicando nele no Windows Explorer.
Este é o resultado:
<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>