Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
gäller för:SQL Server
Azure SQL Database
Du kan begränsa rader som returneras från en databasfråga baserat på något begränsande värde. sql:limit-field och sql:limit-value-annotationerna används för att identifiera databaskolumnen som innehåller gränsvärden och för att specificera ett specifikt gränsvärde som ska användas för att filtrera den returnerade datan.
sql:limit-field-annotationen används för att identifiera en kolumn som innehåller ett gränsvärde; det är tillåtet på varje mappat element eller attribut.
sql:limit-value-annotationen används för att ange det begränsade värdet i kolumnen som anges i sql:limit-field-annotationen. sql:limit-value-annotationen är valfri. Om sql:limit-value inte specificeras, antas ett NULL-värde.
Anmärkning
När man arbetar med ett sql:limit-fält där den mappade SQL-kolumnen är av typen real, utför SQLXML 4.0 konvertering på sql:limit-value enligt XML-scheman som ett nvarchar-specificerat värde. Detta kräver att decimalgränsvärden anges med fullständig vetenskaplig notation. För mer information, se Exempel B nedan.
Examples
För att skapa arbetsprover med dessa exempel behöver du ha följande installerat:
Microsoft SQL Server Native Client
MDAC 2.6 eller senare
I dessa exempel används mallar för att specificera XPath-frågor mot mapping XSD-schemat.
A. Begränsning av kundadresserna som returneras till en specifik adresstyp
I detta exempel innehåller en databas två tabeller:
Customer (CustomerID, CompanyName)
Adresser (KundID, Adresstyp, Gatuadress)
En kund kan ha en leveransadress och/eller en faktureringsadress. Kolumnvärdena för AddressType är Frakt och Fakturering.
Detta är mappningsschemat där attributet ShipTo-schemat mappas till kolumnen StreetAddress i relationen Address. De värden som returneras för detta attribut är begränsade till endast att leverera adresser genom att ange sql:limit-field och sql:limit-value-annotationerna . På liknande sätt returnerar BillTo-schemaattributet endast kundens faktureringsadress.
Detta är 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>
För att testa en exempel-XPath-fråga mot schemat
Skapa två tabeller i tempdb-databasen :
USE tempdb CREATE TABLE Customer (CustomerID int primary key, CompanyName varchar(30)) CREATE TABLE Addresses(CustomerID int, StreetAddress varchar(50), AddressType varchar(10))Lägg till exempeldata:
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')Kopiera schemakoden ovan och klistra in den i en textfil. Spara filen som LimitFieldValue.xml.
Skapa följande mall (LimitFieldValueT.xml) ) och spara den på samma sätt som du sparade schemat (LimitFieldValue.xml) i föregående steg:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="LimitFieldValue.xml"> /Customer </sql:xpath-query> </ROOT>Den katalogväg som anges för mappningsschemat (LimitFieldValue.xml) är relativ till katalogen där mallen sparas. En absolut väg kan också specificeras, till exempel:
mapping-schema="C:\MyDir\LimitFieldValue.xml"Skapa och använd SQLXML 4.0 Test Script (Sqlxml4test.vbs) för att köra mallen.
För mer information, se Användning av ADO för att köra SQLXML-frågor.
Det här är resultatet:
<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. Begränsningsresultat baserat på ett diskonteringsvärde av typen reella data
I detta exempel innehåller en databas två tabeller:
Order (OrderID)
Orderdetaljer (OrderID, ProduktID, Enhetspris, Mängd, Pris, Rabatt)
Detta är mappningsschemat där attributet OrderID på orderdetaljerna mappas till kolumnen OrderID i orderrelationen. De värden som returneras för detta attribut är begränsade till endast de som har värdet 2,0000000e-001 (0,2) enligt specificeringen för Discount-attributet med hjälp av sql:limit-field och sql:limit-value-annotationerna .
Detta är 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>
För att testa en exempel-XPath-fråga mot schemat
Skapa två tabeller i tempdb-databasen :
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]Lägg till exempeldata:
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)Spara schemat (LimitFieldValue.xml) i en katalog.
Skapa följande testskript (TestQuery.vbs), ändra MyServer till namnet på din SQL Server-dator och spara det i samma katalog som du använde i föregående steg för att spara schemat:
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"Kör TestQuery.vbs-filen genom att klicka på den i Windows Utforskaren.
Det här är resultatet:
<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>
Se även
float och real (Transact-SQL)
nchar och nvarchar (Transact-SQL)
Installera den interna SQL Server-klienten
Användning av annoterade XSD-scheman i frågor (SQLXML 4.0)