Filtrowanie przy użyciu wartości sql:limit — pole i sql:limit — wartość (SQLXML 4.0)
Można ograniczyć wiersze, które są zwracane z zapytania do bazy danych w oparciu o pewne wartości graniczne.The sql:limit-field and sql:limit-value annotations are used to identify the database kolumna that contains limiting values and to specify a specific limiting value to be used to filter the data returned.
The sql:limit-field annotation is used to identify a kolumna that contains a limiting value; it is allowed on each mapped element or atrybut.
The sql:limit-value annotation is used to specify the limited value in the kolumna that is specified in the sql:limit-field annotation. The sql:limit-value annotation is optional.Jeśli sql:limit-value to nie jest określony, jest przyjmowana wartość NULL.
Uwaga
Podczas pracy z sql:limit-field w przypadku gdy mapowane SQL kolumna jest typu realSQLXML 4.0 wykonuje konwersję na sql:limit-value jak określono w schematach XML jako nvarchar Określona wartość. To wymaga wartości dziesiętne limit określony przy użyciu pełnego zapisu naukowego.Aby uzyskać więcej informacji zobacz temat B przykład poniżej.
Przykłady
Aby utworzyć próbek pracy przy użyciu tych przykładów, należy mieć zainstalowane następujące elementy:
Microsoft SQL Server Macierzysta klient
Składniki MDAC 2.6 lub nowszej
W tych przykładach szablony są używane do określania kwerend XPath względem schematu XSD mapowania.
A.Ograniczenia adresów klientów zwracane do typu określonego adresu
W tym przykładzie baza danych zawiera dwie tabele:
Klienta (IDklienta, CompanyName)
Adresy (identyfikator klienta, AddressType, StreetAddress)
Klient może mieć adres wysyłkowy lub adres rozliczeniowy.Wartości kolumna AddressType są dostawy i faktury.
Jest to schemat mapowania, w którym ShipTo atrybut schematu jest mapowany na kolumnie StreetAddress w odniesieniu do adresów.Wartości, które są zwracane dla tego atrybut są ograniczone do tylko wysyłki adresów przez podanie sql:limit-field i sql:limit-value adnotacje. Podobnie BillTo atrybut schematu zwraca tylko adres bilingowy klienta.
Jest to schemat:
<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>
Aby przetestować kwerendę XPath próbki względem schematu
Utwórz dwie tabele w tempdb bazy danych:
USE tempdb CREATE TABLE Customer (CustomerID int primary key, CompanyName varchar(30)) CREATE TABLE Addresses(CustomerID int, StreetAddress varchar(50), AddressType varchar(10))Dodaj dane przykładowe:
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')Skopiować powyższy kod schematu i wkleić go do pliku tekstowego.Zapisz plik jako LimitFieldValue.xml.
Utwórz następujący szablon (LimitFieldValueT.xml), a następnie zapisz go w taki sam, której schematu (LimitFieldValue.xml) został zapisany w poprzednim kroku:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="LimitFieldValue.xml"> /Customer </sql:xpath-query> </ROOT>To ścieżka do katalogu określonego dla mapowania schematu (LimitFieldValue.xml) jest względna w stosunku do katalogu, w którym są zapisywane w szablonie.Ścieżka bezwzględna również można określić, na przykład:
mapping-schema="C:\MyDir\LimitFieldValue.xml"Tworzenie i używanie skryptu testu 4.0 SQLXML (Sqlxml4test.vbs) do wykonać tego szablonu.
Aby uzyskać więcej informacji zobacz Przy użyciu obiektu ADO w celu wykonać kwerendy SQLXML.
Oto wynik:
<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.Ograniczanie wyniki na podstawie typu danych rzeczywistych wartości rabatu
W tym przykładzie baza danych zawiera dwie tabele:
Zamówienia (identyfikator zamówienia)
SzczegółyZamówienia (IDZamówienia i IDProduktu CenaJednostkowa, ilość, cena, rabat)
Jest to schemat mapowania, w którym Identyfikator zamówienia atrybut szczegóły zamówienia jest mapowany do kolumna Identyfikator zamówienia w odniesieniu do zamówienia.Wartości, które są zwracane dla tego atrybutu są ograniczone do tylko tych, które mają wartość 2.0000000e-001 (0,2) określony dla Rabat atrybut używającsql:limit-field i sql:limit-value adnotacje.
Jest to schemat:
<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>
Aby przetestować kwerendę XPath próbki względem schematu
Utwórz dwie tabele w tempdb bazy danych:
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]Dodaj dane przykładowe:
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)Zapisywanie schematu (LimitFieldValue.xml) w katalogu.
Utwórz następujący skrypt testu (TestQuery.vbs), zmodyfikować MójSerwer na nazwę tego komputera z programem SQL Server i zapisać go w tym samym katalogu, używany w poprzednim kroku w celu zapisania schematu:
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"wykonać pliku TestQuery.vbs przez kliknięcie jej w Eksploratorze Windows.
Oto wynik:
<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>
See Also