2

是否可以从数据库中获取 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')
4

1 回答 1

0

这种类型的事情在动态 SQL 中是可能的,但显然它有其自身的问题。请阅读 Erland Sommarskog 关于该主题的这篇优秀文章

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

不过可能是一个单独的问题;)

高温高压

于 2012-09-24T21:42:31.173 回答