Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Je kunt rijen die worden teruggegeven vanuit een databasequery beperken op basis van een limietwaarde. De sql:limit-field en sql:limit-value annotaties worden gebruikt om de databasekolom te identificeren die limietwaarden bevat en om een specifieke limietwaarde te specificeren die gebruikt moet worden om de teruggegeven data te filteren.
De sql:limit-field annotatie wordt gebruikt om een kolom te identificeren die een limietwaarde bevat; het is toegestaan op elk toegewezen element of attribuut.
De sql:limit-value annotatie wordt gebruikt om de beperkte waarde in de kolom te specificeren die in de sql:limit-field annotatie is opgegeven. De sql:limit-value annotatie is optioneel. Als sql:limit-value niet wordt gespecificeerd, wordt aangenomen dat er een NULL-waarde is.
Opmerking
Bij het werken met een sql:limit-veld waarbij de gemapte SQL-kolom van het type real is, voert SQLXML 4.0 conversie uit op de sql:limit-value zoals gespecificeerd in XML-schema's als een nvarchar-gespecificeerde waarde. Dit vereist dat decimale limietwaarden worden gespecificeerd met volledige wetenschappelijke notatie. Voor meer informatie, zie Voorbeeld B hieronder.
Voorbeelden
Om werkmonsters te maken met deze voorbeelden, moet je het volgende geïnstalleerd hebben:
Microsoft SQL Server Native Client
MDAC 2.6 of later
In deze voorbeelden worden sjablonen gebruikt om XPath-queries te specificeren tegen het mapping XSD-schema.
Eén. Het beperken van de klantadressen die terugkomen tot een specifiek adrestype
In dit voorbeeld bevat een database twee tabellen:
Klant (CustomerID, Bedrijfsnaam)
Adressen (KlantID, AdresType, Straatadres)
Een klant kan een verzendadres en/of een factuuradres hebben. De kolomwaarden van AddressType zijn Verzending en Facturering.
Dit is het mappingschema waarin het ShipTo-schema-attribuut wordt gekoppeld aan de kolom StreetAddress in de Address-relatie. De waarden die voor dit attribuut worden teruggegeven, zijn beperkt tot alleen verzendadressen door de sql:limit-field en sql:limit-value annotaties te specificeren. Evenzo geeft het BillTo schema-attribuut alleen het factuuradres van een klant terug.
Dit is het schema:
<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>
Om een voorbeeld van een XPath-query te testen tegen het schema
Maak twee tabellen aan in de tempdb-database :
USE tempdb CREATE TABLE Customer (CustomerID int primary key, CompanyName varchar(30)) CREATE TABLE Addresses(CustomerID int, StreetAddress varchar(50), AddressType varchar(10))Voeg de voorbeeldgegevens toe:
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')Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als LimitFieldValue.xml.
Maak de volgende template aan (LimitFieldValueT.xml), en sla deze op in dezelfde situatie als waar je het schema (LimitFieldValue.xml) in de vorige stap hebt opgeslagen:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="LimitFieldValue.xml"> /Customer </sql:xpath-query> </ROOT>Het directorypad dat voor het mappingschema (LimitFieldValue.xml) is gespecificeerd is relatief tot de map waar het sjabloon wordt opgeslagen. Een absoluut pad kan ook worden gespecificeerd, bijvoorbeeld:
mapping-schema="C:\MyDir\LimitFieldValue.xml"Maak het SQLXML 4.0 Test Script (Sqlxml4test.vbs) aan en gebruik het om het sjabloon uit te voeren.
Voor meer informatie, zie Gebruik ADO om SQLXML-queries uit te voeren.
Dit is het resultaat:
<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. Beperkende resultaten op basis van een disconteringswaarde van het type reële data
In dit voorbeeld bevat een database twee tabellen:
Orders (OrderID)
Orderdetails (OrderID, ProductID, Eenheidsprijs, Hoeveelheid, Prijs, Korting)
Dit is het mappingschema waarbij het OrderID-attribuut op de orderdetails wordt gekoppeld aan de OrderID-kolom in de orderrelatie. De waarden die voor dit attribuut worden teruggegeven, zijn beperkt tot alleen die welke een waarde van 2,0000000e-001 (0,2) hebben, zoals gespecificeerd voor het Discount-attribuut met behulp van de sql:limit-field en sql:limit-value annotaties.
Dit is het schema:
<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>
Om een voorbeeld van een XPath-query te testen tegen het schema
Maak twee tabellen aan in de tempdb-database :
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]Voeg de voorbeeldgegevens toe:
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)Sla het schema (LimitFieldValue.xml) op in een map.
Maak het volgende testscript aan (TestQuery.vbs), wijzig MyServer naar de naam van je SQL Server-computer en sla het op in dezelfde map als in de vorige stap om het schema op te slaan:
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"Voer het TestQuery.vbs-bestand uit door erop te klikken in Windows Verkenner.
Dit is het resultaat:
<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>
Zie ook
drijvend en echt (Transact-SQL)
nchar en nvarchar (Transact-SQL)
SQL Server Native Client installeren
Gebruik van geannoteerde XSD-schema's in queries (SQLXML 4.0)