是否可以在FOR XML Clause的结果xml中获取名称空间的一些数据 来自数据库
e.g。
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 :(得分: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问题,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