Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
WITH XMLNAMESPACES (Transact-SQL) bietet Namespace-URI-Unterstützung auf folgende Weise:
Es stellt das Namespacepräfix zur URI-Zuordnung zur Verfügung, wenn XML mithilfe von FOR XML-Abfragen erstellt wird.
Er stellt den Namespace zur URI-Zuordnung für den statischen Namespacekontext der XML-Datentypmethoden zur Verfügung.
Verwenden von WITH XMLNAMESPACES in den FOR XML-Abfragen
MIT XMLNAMESPACES können Sie XML-Namespaces in FOR XML-Abfragen einschließen. Betrachten Sie beispielsweise die folgende FOR XML-Abfrage:
SELECT ProductID, Name, Color
FROM Production.Product
WHERE ProductID=316 or ProductID=317
FOR XML RAW
Dies ist das Ergebnis:
<row ProductID="316" Name="Blade" />
<row ProductID="317" Name="LL Crankarm" Color="Black" />
Um namespaces zum XML-Code hinzuzufügen, der von der FOR XML-Abfrage erstellt wird, geben Sie zuerst das Namespacepräfix zu URI-Zuordnungen mithilfe der WITH NAMESPACES-Klausel an. Verwenden Sie dann die Namespacepräfixe, um die Namen in der Abfrage anzugeben, wie in der folgenden geänderten Abfrage dargestellt. Beachten Sie, dass die WITH XMLNAMESPACES-Klausel die Zuordnung des Namespacepräfixes (ns1) zur URI (uri) angibt. Das ns1 Präfix wird dann verwendet, um die Element- und Attributnamen anzugeben, die von der FOR XML-Abfrage erstellt werden sollen.
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Production.Product
WHERE ProductID=316 or ProductID=317
FOR XML RAW ('ns1:Prod'), ELEMENTS
Das XML-Ergebnis enthält die Namespacepräfixe:
<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>
Die folgende Gilt für die WITH XMLNAMESPACES-Klausel:
Sie wird nur in den Modi RAW, AUTO und PATH der FOR XML-Abfragen unterstützt. Der EXPLICIT-Modus wird nicht unterstützt.
Er wirkt sich nur auf die Namespacepräfixe von FOR XML-Abfragen und die XML-Datentypmethoden aus, jedoch nicht auf den XML-Parser. Die folgende Abfrage gibt beispielsweise einen Fehler zurück, da das XML-Dokument keine Namespacedeklaration für das MyNS-Präfix aufweist.
Die FOR XML-Direktiven, XMLSCHEMA und XMLDATA können nicht verwendet werden, wenn eine WITH XMLNAMESPACES-Klausel verwendet wird.
CREATE TABLE T (x xml) go WITH XMLNAMESPACES ('http://abc' as myNS ) INSERT INTO T VALUES('<myNS:root/>')
Die Verwendung der XSINIL-Direktive
Sie können das XSI-Präfix in der WITH XMLNAMESPACES-Klausel nicht definieren, wenn Sie die ELEMENTS XSINIL-Direktive verwenden. Stattdessen wird sie automatisch hinzugefügt, wenn Sie ELEMENTE XSINIL verwenden. Die folgende Abfrage verwendet ELEMENTS XSINIL, die elementorientiertes XML generiert, wobei Nullwerte Elementen zugeordnet werden, die das xsi:nil-Attribut auf "True" festgelegt haben.
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
Dies ist das Ergebnis:
<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>
Festlegen von Standardnamespaces
Anstatt ein Namespacepräfix zu deklarieren, können Sie einen Standardnamespace mithilfe eines DEFAULT-Schlüsselworts deklarieren. In der FOR XML-Abfrage wird der Standardnamespace an XML-Knoten im resultierenden XML gebunden. Im folgenden Beispiel definiert das WITH XMLNAMESPACES zwei Namespacepräfixe, die zusammen mit einem Standardnamespace definiert sind.
WITH XMLNAMESPACES ('uri1' as ns1,
'uri2' as ns2,
DEFAULT 'uri2')
SELECT ProductID,
Name,
Color
FROM Production.Product
WHERE ProductID=316 or ProductID=317
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS
Die FOR XML-Abfrage generiert elementorientiertes XML. Beachten Sie, dass die Abfrage beide Namespacepräfixe in Benennungsknoten verwendet. In der SELECT-Klausel geben "ProductID", "Name" und "Color" keinen Namen mit einem Präfix an. Daher gehören die entsprechenden Elemente im resultierenden XML-Code zum Standardnamespace.
<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>
Die folgende Abfrage ähnelt der vorherigen Abfrage, mit der Ausnahme, dass der FOR XML-AUTO-Modus angegeben ist.
WITH XMLNAMESPACES ('uri1' as ns1, 'uri2' as ns2,DEFAULT 'uri2')
SELECT ProductID,
Name,
Color
FROM Production.Product as "ns1:Product"
WHERE ProductID=316 or ProductID=317
FOR XML AUTO, ROOT('ns2:root'), ELEMENTS
Verwenden vordefinierter Namespaces
Wenn Sie vordefinierte Namespaces verwenden, mit Ausnahme des XML-Namespaces und des xsi-Namespaces, wenn ELEMENTE XSINIL verwendet werden, müssen Sie die Namespacebindung explizit mithilfe von WITH XMLNAMESPACES angeben. Die folgende Abfrage definiert explizit das Namespacepräfix zur URI-Bindung für den vordefinierten Namespace (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')
Dies ist das Ergebnis. SQLXML-Benutzer sind mit dieser XML-Vorlage vertraut. Weitere Informationen finden Sie unter SQLXML 4.0-Programmierkonzepte.
<sql:root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query>SELECT * FROM Customers FOR XML AUTO, ROOT("a")</sql:query>
</sql:root>
Nur das XML-Namespacepräfix kann verwendet werden, ohne es explizit in WITH XMLNAMESPACES zu definieren, wie in der folgenden PATH-Modus-Abfrage dargestellt. Wenn das Präfix deklariert ist, muss es auch an den Namespace http://www.w3.org/XML/1998/namespacegebunden werden. Die in der SELECT-Klausel angegebenen Namen beziehen sich auf das XML-Namespacepräfix, das nicht explizit mithilfe von WITH XMLNAMESPACES definiert ist.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation')
go
Die @xml:lang Attribute verwenden den vordefinierten XML-Namespace. Da die XML-Version 1.0 keine explizite Deklaration der XML-Namespacebindung erfordert, enthält das Ergebnis keine explizite Deklaration der Namespacebindung.
Dies ist das Ergebnis:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
Verwenden von WITH XMLNAMESPACES mit den XML-Datentypmethoden
Die xml-Datentypmethoden , die in einer SELECT-Abfrage oder in UPDATE angegeben sind, wenn es sich um die Modify() -Methode handelt, müssen alle die Namespacedeklaration in ihrem Prolog wiederholen. Dies kann zeitaufwändig sein. Die folgende Abfrage ruft z. B. Produktmodell-IDs ab, deren Katalogbeschreibungen die Spezifikation enthalten. Das heißt, das <Specifications> Element ist vorhanden.
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
In der vorherigen Abfrage deklarieren sowohl die Methoden query() als auch exist() denselben Namespace in ihrem Prolog. Beispiel:
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
Alternativ können Sie WITH XMLNAMESPACES zuerst deklarieren und die Namespacepräfixe in der Abfrage verwenden. In diesem Fall müssen die Methoden "query() " und " exist()" keine Namespacedeklarationen in ihrem Prolog enthalten.
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
Beachten Sie, dass eine explizite Deklaration im XQuery-Prolog das Namespacepräfix und den Standardelementnamespace außer Kraft setzt, der in der WITH-Klausel definiert ist.
Siehe auch
xml Data Type Methods (xml-Datentypmethoden)
XQuery-Sprachreferenz (SQL Server)
WITH XMLNAMESPACES (Transact-SQL)
FOR XML (SQL Server)