2012-05-30 18 views
2

是有可能從數據庫查詢裏面搭配XML命名空間子句

獲得的FOR XML子句 結果XML命名空間的一些數據,例如

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 

結果:

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

如果我想獲得的值從數據庫裏面?

是這樣的:

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

你不能這樣做 - 'WITH XMLNAMESPACES(....)'子句中的值必須是字符串文字。 –

+0

我看到了,所以它會被硬編碼,謝謝@marc_s – Mido

+0

是的 - 它似乎甚至不能使用SQL變量,所以是的,你必須硬編碼這些命名空間 –

回答

0

這種類型的事情是可能的動態SQL但顯然有它自己的問題。請閱讀Erland Sommarskog關於該主題的優秀article

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 

回覆您的FOR XML AUTO問題,汽車是由物體和列名驅動的,所以你可以藉此使用別名的控制,如

;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 

我個人比較喜歡FOR XML PATH此因爲你擁有完全的控制權,並且所有的東西都是明確的(即你必須指定命名空間和元素或屬性,而不是通過AUTO來推斷)。

;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') 

雖然可能是一個單獨的問題; )

HTH