Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Z FUNKCJĄ XMLNAMESPACES (Transact-SQL) zapewnia obsługę identyfikatorów URI przestrzeni nazw w następujący sposób:
Udostępnia prefiks przestrzeni nazw do mapowania identyfikatora URI, gdy konstruowanie kodu XML przy użyciu zapytań FOR XML.
Umożliwia dostęp do mapowania przestrzeni nazw na identyfikatory URI w statycznym kontekście przestrzeni nazw metod typów danych XML .
Używaj WITH XMLNAMESPACES w zapytaniach FOR XML
WITH XMLNAMESPACES umożliwia uwzględnianie przestrzeni nazw XML w zapytaniach XML. Rozważmy na przykład następujące zapytanie FOR XML:
SELECT ProductID, Name, Color
FROM Production.Product
WHERE ProductID IN (316, 317)
FOR XML RAW;
Jest to wynik:
<row ProductID="316" Name="Blade" />
<row ProductID="317" Name="LL Crankarm" Color="Black" />
Aby dodać przestrzenie nazw do pliku XML utworzonego przez zapytanie FOR XML, najpierw określ prefiks przestrzeni nazw do mapowań identyfikatorów URI przy użyciu klauzuli WITH NAMESPACES. Następnie użyj prefiksów przestrzeni nazw, określając nazwy w zapytaniu, jak pokazano w poniższym zmodyfikowanym zapytaniu. Klauzula WITH XMLNAMESPACES określa prefiks przestrzeni nazw (ns1
) do mapowania identyfikatora URI (uri
). Prefiks ns1
jest następnie używany do określania nazw elementów i atrybutów, które mają być konstruowane przez zapytanie FOR XML.
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;
Wynik XML zawiera prefiksy przestrzeni nazw:
<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>
Następujące zasady dotyczą klauzuli WITH XMLNAMESPACES:
Jest obsługiwany tylko w trybach RAW, AUTO i PATH zapytań FOR XML. Tryb JAWNY nie jest obsługiwany.
Wpływa to jedynie na prefiksy nazw przestrzeni w zapytaniach FOR XML oraz metody typu danych xml, ale nie dotyczy parsera XML. Na przykład następujące zapytanie zwraca błąd, ponieważ dokument XML nie ma deklaracji przestrzeni nazw dla prefiksu myNS.
Dyrektywy FOR XML, XMLSCHEMA i XMLDATA nie mogą być używane, gdy jest używana klauzula WITH XMLNAMESPACES.
CREATE TABLE T (x xml); GO WITH XMLNAMESPACES ('https://abc' as myNS ) INSERT INTO T VALUES('<myNS:root/>'); GO
Użyj dyrektywy XSINIL
Nie można zdefiniować prefiksu xsi w klauzuli WITH XMLNAMESPACES, jeśli używasz dyrektywy ELEMENTS XSINIL. Zamiast tego, jest on dodawany automatycznie, gdy używasz ELEMENTS XSINIL. Poniższe zapytanie używa elementu ELEMENTS XSINIL, który generuje kod XML skoncentrowany na elementach, gdzie wartości null są mapowane na elementy, które mają atrybut xsi:nil ustawiony na wartość 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;
Jest to wynik:
<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>
Określanie domyślnych przestrzeni nazw
Zamiast deklarować prefiks przestrzeni nazw, można zadeklarować domyślną przestrzeń nazw przy użyciu słowa kluczowego DEFAULT. W zapytaniu FOR XML zostanie powiązana domyślna przestrzeń nazw z węzłami XML w wynikowym pliku XML. W poniższym przykładzie funkcja WITH XMLNAMESPACES definiuje dwa prefiksy przestrzeni nazw zdefiniowane razem z domyślną przestrzenią nazw.
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;
Zapytanie FOR XML generuje kod XML skoncentrowany na elementach. Zapytanie używa obu prefiksów przestrzeni nazw do nazewnictwa węzłów. W klauzuli SELECT identyfikator produktu, nazwa i kolor nie określają nazwy z żadnym prefiksem. W związku z tym odpowiednie elementy w wynikowym pliku XML należą do domyślnej przestrzeni nazw.
<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>
Poniższe zapytanie jest podobne do poprzedniego, z tą różnicą, że określono tryb AUTO FOR XML.
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;
Używanie wstępnie zdefiniowanych przestrzeni nazw
W przypadku używania wstępnie zdefiniowanych przestrzeni nazw, z wyjątkiem przestrzeni nazw XML i przestrzeni nazw xsi, gdy jest używana funkcja ELEMENTS XSINIL, należy jawnie określić powiązanie przestrzeni nazw przy użyciu funkcji WITH XMLNAMESPACES. Następujące zapytanie jawnie definiuje prefiks przestrzeni nazw, aby związać URI z wstępnie zdefiniowaną przestrzenią nazw (urn:schemas-microsoft-com:xml-sql
).
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');
Jest to wynik. Użytkownicy programu SQLXML znają ten szablon XML. Aby uzyskać więcej informacji, zobacz Koncepcje programowania SQLXML 4.0.
<sql:root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query>SELECT * FROM Customers FOR XML AUTO, ROOT("a")</sql:query>
</sql:root>
Tylko prefiks przestrzeni nazw XML może być używany bez jawnego zdefiniowania go w funkcji WITH XMLNAMESPACES, jak pokazano w poniższym zapytaniu trybu PATH. Ponadto, jeśli prefiks jest zadeklarowany, musi być powiązany z przestrzenią nazw http://www.w3.org/XML/1998/namespace. Nazwy określone w klauzuli SELECT odnoszą się do prefiksu przestrzeni nazw XML, który nie jest jawnie zdefiniowany przy użyciu funkcji WITH XMLNAMESPACES.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation');
GO
Atrybuty @xml:lang
używają wstępnie zdefiniowanej przestrzeni nazw XML. Ponieważ kod XML w wersji 1.0 nie wymaga jawnej deklaracji powiązania przestrzeni nazw XML, wynik nie będzie zawierać jawnej deklaracji powiązania przestrzeni nazw.
Jest to wynik:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
Używanie funkcji WITH XMLNAMESPACES z metodami typu danych XML
Wszystkie metody typu danych XML określone w zapytaniu SELECT lub w UPDATE, gdy jest to metoda modify()
, muszą powtórzyć deklarację przestrzeni nazw w swoim prologu. Może to być czasochłonne. Na przykład następujące zapytanie pobiera identyfikatory modeli produktów, których opisy katalogów zawierają specyfikację. Oznacza to, że element <Specifications>
istnieje.
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;
W poprzednim zapytaniu metody query()
i exist()
deklarują tę samą przestrzeń nazw w swoim prologu. Na przykład:
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
Alternatywnie można najpierw zadeklarować wartość WITH XMLNAMESPACES i użyć prefiksów przestrzeni nazw w zapytaniu. W tym przypadku metody query()
i exist()
nie muszą uwzględniać deklaracji przestrzeni nazw w ich prologu.
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
Jawna deklaracja w prologu XQuery zastępuje prefiks przestrzeni nazw i domyślną przestrzeń nazw elementu zdefiniowaną w klauzuli WITH.