Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Pode limitar as linhas que são devolvidas de uma consulta de base de dados com base num valor limitante. As anotações sql:limit-field e sql:limit-value são usadas para identificar a coluna da base de dados que contém valores limitantes e para especificar um valor limite específico a ser usado para filtrar os dados devolvidos.
A anotação sql:limit-field é usada para identificar uma coluna que contém um valor limite; É permitido em cada elemento ou atributo mapeado.
A anotação sql:limit-value é usada para especificar o valor limitado na coluna que é especificado na anotação sql:limit-field . A anotação sql:limit-value é opcional. Se não for especificado valor de limite , assume-se um valor NULL.
Observação
Ao trabalhar com um campo sql:limit , onde a coluna SQL mapeada é do tipo real, o SQLXML 4.0 realiza a conversão no valor sql:limit , conforme especificado nos esquemas XML, como valor especificado por nvarchar . Isto exige que os valores limites decimais sejam especificados usando notação científica completa. Para mais informações, consulte o Exemplo B abaixo.
Examples
Para criar amostras funcionais usando estes exemplos, é necessário ter o seguinte instalado:
Cliente nativo do Microsoft SQL Server
MDAC 2.6 ou posterior
Nestes exemplos, os templates são usados para especificar consultas XPath contra o esquema XSD de mapeamento.
A. Limitar os endereços dos clientes devolvidos a um tipo específico de endereço
Neste exemplo, uma base de dados contém duas tabelas:
Cliente (CustomerID, Nome da Empresa)
Moradas (CustomerID, TypeAddress, StreetAddress)
Um cliente pode ter um endereço de envio e/ou um endereço de faturação. Os valores das colunas AddressType são Envio e Faturação.
Este é o esquema de mapeamento em que o atributo do esquema ShipTo corresponde à coluna StreetAddress na relação Addresss. Os valores devolvidos para este atributo limitam-se apenas a endereços de envio, especificando as anotações sql:limit-field e sql:limit-value . De forma semelhante, o atributo do esquema BillTo devolve apenas o endereço de faturação de um cliente.
Este é o esquema:
<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>
Para testar uma consulta XPath de exemplo contra o esquema
Crie duas tabelas na base 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 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')Copie o código do esquema acima e cole num ficheiro de texto. Guarde o ficheiro como LimitFieldValue.xml.
Crie o seguinte modelo (LimitFieldValueT.xml), e guarde-o no mesmo lugar onde guardou o esquema (LimitFieldValue.xml) no passo anterior:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="LimitFieldValue.xml"> /Customer </sql:xpath-query> </ROOT>O caminho do diretório especificado para o esquema de mapeamento (LimitFieldValue.xml) é relativo ao diretório onde o modelo é guardado. Um caminho absoluto também pode ser especificado, por exemplo:
mapping-schema="C:\MyDir\LimitFieldValue.xml"Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.
Para mais informações, consulte Utilização de ADO para Executar Consultas SQLXML.
Este é o resultado:
<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. Limitação dos resultados com base num valor de desconto do tipo real data
Neste exemplo, uma base de dados contém duas tabelas:
Ordens (OrderID)
OrderDetails (OrderID, ProductID, UnitPrice, Quantidade, Preço, Desconto)
Este é o esquema de mapeamento em que o atributo OrderID nos detalhes da ordem corresponde à coluna OrderID na relação de ordens. Os valores devolvidos para este atributo são limitados apenas àqueles que tenham um valor de 2,0000000e-001 (0,2), conforme especificado para o atributo Desconto usando as anotações sql:limit-field e sql:limit-value .
Este é o esquema:
<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>
Para testar uma consulta XPath de exemplo contra o esquema
Crie duas tabelas na base 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)Guarde o esquema (LimitFieldValue.xml) num diretório.
Crie o seguinte script de teste (TestQuery.vbs), modifique o MyServer para o nome do seu computador SQL Server e guarde-o no mesmo diretório que usou no passo anterior para guardar 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}" 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 ficheiro TestQuery.vbs clicando nele no Explorador do Windows.
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>
Ver também
flutuador e real (Transact-SQL)
Nchar e Nvarchar (Transact-SQL)
Instalando o SQL Server Native Client
Utilização de Esquemas XSD Anotados em Consultas (SQLXML 4.0)