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
Wanneer een XPath-query wordt gespecificeerd tegen een XSD-schema, is in de meeste gevallen sleutelinformatie vereist om een juiste geneste indeling van het resultaat te verkrijgen. Het specificeren van de sql:key-fields-annotatie is een manier om ervoor te zorgen dat de juiste hiërarchie wordt gegenereerd.
Opmerking
Om een goede genesting te garanderen, wordt aanbevolen om sql:key-fields te specificeren voor elementen die naar tabellen worden toegewezen. De geproduceerde XML is gevoelig voor de ordening van de onderliggende resultaatset. Als sql:key-fields niet is gespecificeerd, kan het zijn dat de gegenereerde XML niet correct is gevormd.
De waarde van sql:key-fields identificeert de kolom(men) die de rijen in de relatie uniek identificeren. Als meer dan één kolom nodig is om een rij uniek te identificeren, worden de kolomwaarden begrensd door spakjes.
Je moet de sql:key-fields-annotatie gebruiken wanneer een element een <sql:relatie> bevat die is gedefinieerd tussen het element en een kindelement, maar niet de primaire sleutel van de tabel geeft die in het ouderelement is gespecificeerd.
Voorbeelden
Om werkmonsters te maken met de volgende voorbeelden, moet je aan bepaalde eisen voldoen. Voor meer informatie, zie Vereisten voor het uitvoeren van SQLXML-voorbeelden.
Eén. Het maken van de juiste genesing wanneer <sql:relationship> niet voldoende informatie oplevert
Dit voorbeeld laat zien waar sql:key-fields moeten worden gespecificeerd.
Beschouw het volgende schema. Het schema specificeert een hiërarchie tussen de <Order> - en <Customer-elementen> , waarbij het <Order-element> de ouder is en het <Customer-element> een kind.
De <sql:relationship-tag> wordt gebruikt om de ouder-kindrelatie te specificeren. Het identificeert CustomerID in de Sales.SalesOrderHeader-tabel als de oudersleutel die verwijst naar de CustomerID-kindsleutel in de Sales.Customer-tabel. De informatie die in <sql:relationship> wordt verstrekt, is niet voldoende om rijen in de hoofdtabel (Sales.SalesOrderHeader) uniek te identificeren. Daarom is zonder de sql:key-fields-annotatie de gegenereerde hiërarchie onnauwkeurig.
Met sql:key-fields gespecificeerd op <Order>, identificeert de annotatie uniek de rijen in de ouder (Sales.SalesOrderHeader-tabel), en verschijnen de onderelementen onder de ouder.
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="OrdCust"
parent="Sales.SalesOrderHeader"
parent-key="CustomerID"
child="Sales.Customer"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"
sql:key-fields="SalesOrderID">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Customer" sql:relation="Sales.Customer"
sql:relationship="OrdCust" >
<xsd:complexType>
<xsd:attribute name="CustID" sql:field="CustomerID" />
<xsd:attribute name="SoldBy" sql:field="SalesPersonID" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name= "CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Om een werkend voorbeeld van dit schema te maken
Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als KeyFields1.xml.
Kopieer het volgende sjabloon en plak het in een tekstbestand. Sla het bestand op als KeyFields1T.xml in dezelfde map waar je KeyFields1.xmlhebt opgeslagen. De XPath-query in de template geeft alle <Order-elementen> terug met een CustomerID van minder dan 3.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields1.xml"> /Order[@CustomerID < 3] </sql:xpath-query> </ROOT>Het directorypad dat voor het mappingschema (KeyFields1.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\KeyFields1.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 de gedeeltelijke resultaatset:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43860" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
<Order SalesOrderID="44501" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
<Order SalesOrderID="45283" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
.....
</ROOT>
B. Specificeren sql:key-fields om een juiste genesting in het resultaat te produceren
In het volgende schema is er geen hiërarchie gespecificeerd met sql<:relationship>. Het schema vereist nog steeds het specificeren van de sql:key-fields annotatie om werknemers uniek te identificeren in de HumanResources.Employee-tabel.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Title">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="EmployeeID" type="xsd:integer" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Om een werkend voorbeeld van dit schema te maken
Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als KeyFields2.xml.
Kopieer het volgende sjabloon en plak het in een tekstbestand. Sla het bestand op als KeyFields2T.xml in dezelfde map waar je KeyFields2.xmlhebt opgeslagen. De XPath-query in de template geeft alle <HumanResources.Employee-elementen> terug:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields2.xml"> /HumanResources.Employee </sql:xpath-query> </ROOT>Het directorypad dat voor het mappingschema (KeyFields2.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\KeyFields2.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">
<HumanResources.Employee>
<Title EmployeeID="1">Production Technician - WC60</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="2">Marketing Assistant</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="3">Engineering Manager</Title>
</HumanResources.Employee>
...
</ROOT>