4

SQL で次の XML 文字列を生成し、変数に割り当てる必要があります。

<List>
   <V Value="TESt">
       <Target a="10" b="11"/>
   </V>
   <T Value="TESt1">
       <Target a="100" b="101"/>
   </V>
</List>

そこで、次の SQL コードを書きました。

;WITH XML_CTE AS
(
SELECT 
    1 AS TAG,
    NULL AS Parent,
    UT.title AS [v!1!Value],
    null AS [Target!2!a],
    null AS [Target!2!b]
FROM 
(
    select  
        10 AS A,
        11 AS B,
        'TESt' as title
    union
        select  
        100 AS a,
        101 AS b,
        'TESt1' as title
)UT
UNION ALL
SELECT
    2,
    1,
    UT.title AS Value,
    ut.a,
    ut.b
FROM
(
    select  
        10 AS a,
        11 AS b,
        'TESt' as title
    union
        select  
        100 AS a,
        101 AS b,
        'TESt1' as title
)ut
)
SELECT * FROM XML_CTE 
ORDER BY 
    [V!1!Value], 
[Target!2!a]
FOR XML EXPLICIT, ROOT('List')

しかし、それを xml(または nvarchar) 変数に割り当てるにはどうすればよいですか? 「UNION ALL」のため、CTEでラップする必要がありましたが、CTEに含めると、変数に割り当てることができません。

4

2 に答える 2

3

SELECT * FROM XML_CTE...ステートメントを次のように変更できます

SELECT @MyVariable = 
    (SELECT * FROM XML_CTE 
    ORDER BY 
        [V!1!Value], 
    [Target!2!a]
    FOR XML EXPLICIT, ROOT('List')
    )
于 2013-01-17T20:47:20.343 に答える
3

次のようなデータの初期セットがあると仮定します。

Col1     A     B
------------------
TESt     10    11
TESt1   100   101

次に、古いレガシーモード(これは非常に複雑で複雑です)FOR XML PATH,ROOTではなく、使用することをお勧めしますEXPLICIT

DECLARE @result NVARCHAR(MAX)

;WITH XML_CTE(Col1, A, B) AS
(
  SELECT 
     'TESt', 10, 11
  UNION
  SELECT    
    'TESt1', 100, 101
)
SELECT @Result =
   (SELECT
       Col1 AS '@Value',
       A AS 'Target/@a',
       B AS 'Target/@b'
    FROM XML_CTE 
    FOR XML PATH('V'), ROOT('List')
   )

次の出力が得られます。

<List>
  <V Value="TESt">
    <Target a="10" b="11" />
  </V>
  <V Value="TESt1">
    <Target a="100" b="101" />
  </V>
</List>

あなたが求めたように。

于 2013-01-17T20:47:23.637 に答える