Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
XMLNAMESPACES (Transact-SQL) a névterekhez való URI-támogatást a következő módon biztosítja:
Elérhetővé teszi az URI-megfeleltetés névtér-előtagja, ha XML-t készít XML- lekérdezések használatával.
Elérhetővé teszi a névteret az URI-leképezéshez az xml adattípus-metódusokstatikus névtérkörnyezete számára.
AZ XMLNAMESPACES használata XML-lekérdezésekben
Az XMLNAMESPACES lehetővé teszi, hogy XML-névtereket tartalmazzon az XML-lekérdezésekben. Vegyük például a következő XML-lekérdezést:
SELECT ProductID, Name, Color
FROM Production.Product
WHERE ProductID IN (316, 317)
FOR XML RAW;
Ez az eredmény:
<row ProductID="316" Name="Blade" />
<row ProductID="317" Name="LL Crankarm" Color="Black" />
Ha névtereket szeretne hozzáadni a FOR XML-lekérdezés által létrehozott XML-hez, először adja meg a névtérelőtagot az URI-leképezésekhez a WITH NAMESPACES záradék használatával. Ezután használja a névtér előtagokat a lekérdezésben szereplő nevek megadásához, ahogyan az a következő módosított lekérdezésben is látható. A WITH XMLNAMESPACES záradék megadja a névtér előtagját (ns1) az URI (uri) leképezéséhez. Ezután a ns1 előtagot használja az XML-lekérdezés által létrehozandó elem- és attribútumnevek megadásához.
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Production.Product
WHERE ProductID IN (316, 317)
FOR XML RAW ('ns1:Prod'), ELEMENTS;
Az XML-eredmény tartalmazza a névtér előtagokat:
<ns1:Prod xmlns:ns1="uri">
<ns1:ProductID>316</ns1:ProductID>
<ns1:Name>Blade</ns1:Name>
</ns1:Prod>
<ns1:Prod xmlns:ns1="uri">
<ns1:ProductID>317</ns1:ProductID>
<ns1:Name>LL Crankarm</ns1:Name>
<ns1:Color>Black</ns1:Color>
</ns1:Prod>
A WITH XMLNAMESPACES záradékra az alábbiak vonatkoznak:
Ez csak az XML-lekérdezések RAW, AUTO és PATH módjaiban támogatott. Az EXPLICIT mód nem támogatott.
Ez csak a FOR XML-lekérdezések névtérelőtagjait és az xml- adattípus-metódusokat érinti, az XML-elemzőt azonban nem. Az alábbi lekérdezés például hibát ad vissza, mert az XML-dokumentum nem tartalmaz névtérdeklarációt a myNS-előtaghoz.
A FOR XML-irányelvek, az XMLSCHEMA és az XMLDATA nem használhatók AZ XMLNAMESPACES záradék használatakor.
CREATE TABLE T (x xml); GO WITH XMLNAMESPACES ('https://abc' as myNS ) INSERT INTO T VALUES('<myNS:root/>'); GO
Az XSINIL-irányelv használata
Ha az ELEMENTS XSINIL direktívát használja, nem definiálhatja az xsi előtagot a WITH XMLNAMESPACES záradékban. Helyette automatikusan hozzáadódik, amikor XSINIL elemeket használ. A következő lekérdezés az ELEM XSINIL elemközpontú XML-t használ, ahol a null értékek olyan elemekre vannak leképezve, amelyeknél az xsi:nil attribútum értéke True.
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Production.Product
WHERE ProductID = 316
FOR XML RAW, ELEMENTS XSINIL;
Ez az eredmény:
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="uri">
<ns1:ProductID>316</ns1:ProductID>
<ns1:Name>Blade</ns1:Name>
<ns1:Color xsi:nil="true" />
</row>
Alapértelmezett névterek megadása
Névtérelőtag deklarálása helyett alapértelmezett névteret is deklarálhat ALAPÉRTELMEZETT kulcsszóval. Az XML-lekérdezésben az alapértelmezett névteret az eredményként kapott XML-csomópontokhoz köti. Az alábbi példában a WITH XMLNAMESPACES két névtérelőtagot határoz meg, amelyek egy alapértelmezett névtérrel együtt vannak definiálva.
WITH XMLNAMESPACES ('uri1' as ns1,
'uri2' as ns2,
DEFAULT 'uri2')
SELECT ProductID,
Name,
Color
FROM Production.Product
WHERE ProductID IN (316, 317)
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS;
Az XML-lekérdezés elemközpontú XML-t hoz létre. A lekérdezés a névtér előtagjait használja az elnevezési csomópontokban. A SELECT záradékban a Termékazonosító, a Név és a Szín nem ad meg előtagot tartalmazó nevet. Ezért az eredményként kapott XML megfelelő elemei az alapértelmezett névtérhez tartoznak.
<ns2:root xmlns="uri2" xmlns:ns2="uri2" xmlns:ns1="uri1">
<ns1:Product>
<ProductID>316</ProductID>
<Name>Blade</Name>
</ns1:Product>
<ns1:Product>
<ProductID>317</ProductID>
<Name>LL Crankarm</Name>
<Color>Black</Color>
</ns1:Product>
</ns2:root>
A következő lekérdezés az előzőhöz hasonló, azzal a kivételrel, hogy a FOR XML AUTO mód van megadva.
WITH XMLNAMESPACES ('uri1' as ns1, 'uri2' as ns2,DEFAULT 'uri2')
SELECT ProductID,
Name,
Color
FROM Production.Product as "ns1:Product"
WHERE ProductID IN (316, 317)
FOR XML AUTO, ROOT('ns2:root'), ELEMENTS;
Előre definiált névterek használata
Ha előre definiált névtereket használ, kivéve az XML-névteret és az xsi névteret az ELEMENTS XSINIL használatakor, explicit módon meg kell adnia a névtérkötést az XMLNAMESPACES használatával. Az alábbi lekérdezés explicit módon meghatározza az előre definiált névtér (urn:schemas-microsoft-com:xml-sql) URI-kötéséhez használatos névtér előtagot.
WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-sql' as sql)
SELECT 'SELECT * FROM Customers FOR XML AUTO, ROOT("a")' AS "sql:query"
FOR XML PATH('sql:root');
Ez az eredmény. Az SQLXML-felhasználók ismerik ezt az XML-sablont. További információ: SQLXML 4.0 Programozási alapfogalmak.
<sql:root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query>SELECT * FROM Customers FOR XML AUTO, ROOT("a")</sql:query>
</sql:root>
Csak az xml-névtér előtag használható anélkül, hogy explicit módon meghatározta volna az XMLNAMESPACES-ben, ahogy az az alábbi PATH módú lekérdezésben is látható. Továbbá, ha az előtag deklarálva van, akkor azt a névtérhez http://www.w3.org/XML/1998/namespacekell kötni. A SELECT záradékban megadott nevek az XMLNAMESPACES használatával nem explicit módon definiált xml-névtér-előtagra vonatkoznak.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation');
GO
A @xml:lang attribútumok az előre definiált XML-névteret használják. Mivel az XML 1.0-s verziója nem igényli az XML-névtérkötés explicit deklarációját, az eredmény nem tartalmaz explicit deklarációt a névtérkötésről.
Ez az eredmény:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
WITH XMLNAMESPACES használata az xml-adattípus metódusaival
A SELECT lekérdezésben XML-adattípus-metódusnak, illetve az UPDATE-ben modify() metódus esetén mindnek meg kell ismételnie a névtérdeklarációt a prologban. Ez időigényes lehet. Az alábbi lekérdezés például lekéri azokat a termékmodell-azonosítókat, amelyek katalógusleírásai tartalmazzák a specifikációt. Vagyis a <Specifications> elem létezik.
SELECT ProductModelID, CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product
ProductModelID= "{ sql:column("ProductModelID") }"
/>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/pd:ProductDescription[(pd:Specifications)]'
) = 1;
Az előző lekérdezésben a query() és a exist() metódus is ugyanazt a névteret deklarálja a prologban. Például:
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
Alternatívaként először deklarálhatja az XMLNAMESPACES-t, és használhatja a névtér előtagjait a lekérdezésben. Ebben az esetben a query() és exist() metódusoknak nem kell névtérdeklarációkat tartalmazniuk a prologjukban.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' as pd)
SELECT ProductModelID, CatalogDescription.query('
<Product
ProductModelID= "{ sql:column("ProductModelID") }"
/>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
/pd:ProductDescription[(pd:Specifications)]'
) = 1;
GO
Az XQuery prolog explicit deklarációja felülírja a NÉVTÉR előtagot és a WITH záradékban definiált alapértelmezett elemnévteret.
Lásd még:
- xml-adattípus-metódusok
- XQuery nyelvi referencia (SQL Server)
- XMLNAMESPACES (Transact-SQL)
- XML (SQL Server)