Abfrage innerhalb der XMLNAMESPACE-Klausel

ist es möglich, einige data der Namespaces in der Ergebnis-XML von FOR XML-Klausel aus der database zu erhalten

z.B

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 

ERGEBNISSE :

  <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> 

WAS ICH WIE DER WERT VON INNEN DATENBANK ZU ERHALTEN?

etwas wie das :

 WITH XMLNAMESPACES ('uri1' as ns1, **(SELECT namespace from tableName)** as ns2, DEFAULT 'uri2') 

Diese Art von Ding ist mit dynamischem SQL möglich, aber offensichtlich hat das seine eigenen Probleme. Bitte lesen Sie diesen hervorragenden Artikel von Erland Sommarskog zu diesem Thema.

 DECLARE @productId INT = 317 DECLARE @sql NVARCHAR(MAX) = 'WITH XMLNAMESPACES ( ''uri1'' as ns1, ''@yourNamespace'' as ns2, DEFAULT ''uri2'' ) SELECT ProductID, Name, Color FROM Production.Product WHERE ProductID = @productId FOR XML RAW (''ns1:Product''), ROOT(''ns2:root''), ELEMENTS' SET @sql = REPLACE( @sql, '@yourNamespace', 'ns2' ) EXEC sp_executesql @sql, N'@productId INT', @productId 

Re your FOR XML AUTO Frage, AUTO wird durch die object-und Spaltennamen getrieben, so können Sie die Kontrolle über diese mit Aliase, zB

 ;WITH XMLNAMESPACES( DEFAULT 'uri2', 'ns2' AS ns2, 'uri1' AS ns1 ) SELECT ProductID, Name, Color FROM Production.Product AS "ns1:productO" WHERE ProductID = 317 FOR XML AUTO 

Ich persönlich bevorzuge FOR XML PATH dafür, da du die komplette Kontrolle hast und alles explizit ist (dh du musst Namespace und Element oder Attribut angeben, anstatt es von AUTO abgeleitet zu werden).

 ;WITH XMLNAMESPACES( DEFAULT 'uri2', 'ns2' AS ns2, 'uri1' AS ns1 ) SELECT ProductID AS "@ProductID", Name AS "@Name", Color AS "@Color" FROM Production.Product AS "ns1:productO" WHERE ProductID = 317 FOR XML PATH('ns1:product0') 

Wahrscheinlich eine gesonderte Frage; )

HTH