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>

FROM Inside DATABASE の値を取得したい場合はどうすればよいですか?

このようなもの :

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

おそらく別の質問ですが; )

HTH

于 2012-09-24T21:42:31.173 に答える