如何基于此类查询生成如下的XML?
SELECT
t1.Code,
(SELECT
CASE
WHEN t1.Type = 5 THEN
(SELECT top 1
t2.CodeName
FROM dbo.Table2 t2
WHERE t2.Id = t4.Id
FOR XML PATH('Code'), TYPE)
ELSE
(SELECT
t3.CodeName
FROM dbo.Table3 t3
WHERE t3.Id = t4.Id
FOR XML PATH('Code'), TYPE)
END
FROM dbo.Table4 t4
WHERE t4.Id = t1.Id
FOR XML PATH('CodeNames'), TYPE)
FROM dbo.Table1 t1 WITH (NOLOCK)
FOR XML RAW ('Table1Child'), TYPE, ROOT('Table1Root')
预期输出
<Table1Root>
<Table1Child Code="ABC">
<CodeNames>
<Code Name="A1" />
<Code Name="B2" />
<Code Name="C3" />
</CodeNames>
</Table1Child>
<Table1Child Code="DEF">
<CodeNames>
<Code Name="D4" />
<Code Name="E5" />
<Code Name="F6" />
</CodeNames>
</Table1Child>
</Table1Root>
答案 0 :(得分:1)
执行UNION
而不是CASE
并使用@
创建属性。
SELECT
t1.Code,
(SELECT
(SELECT CodeName as '@Name'
FROM (
SELECT t2.CodeName
FROM Table2 t2
WHERE t2.Id = t4.Id AND
t1.Type = 5
UNION ALL
SELECT t3.CodeName
FROM Table3 t3
WHERE t3.Id = t4.Id AND
t1.Type <> 5
) AS T
FOR XML PATH('Code'), TYPE)
FROM Table4 t4
WHERE t4.Id = t1.Id
FOR XML PATH('CodeNames'), TYPE)
FROM Table1 t1
FOR XML RAW ('Table1Child'), TYPE, ROOT('Table1Root')
看起来您实际上不需要使用Table4
。
SELECT
t1.Code,
(SELECT CodeName as '@Name'
FROM (
SELECT t2.CodeName
FROM Table2 t2
WHERE t2.Id = t1.Id AND
t1.Type = 5
UNION ALL
SELECT t3.CodeName
FROM Table3 t3
WHERE t3.Id = t1.Id AND
t1.Type <> 5
) AS T
FOR XML PATH('Code'), ROOT('CodeNames'), TYPE)
FROM Table1 t1
FOR XML RAW ('Table1Child'), TYPE, ROOT('Table1Root')