jjzjj

sql-server - 在 SQL Server : how do I remove empty elements from nested elements when LEFT OUTER JOIN'ing 中使用 FOR XML AUTO 时

coder 2024-06-27 原文

[编辑]:添加了 RAW 测试和更好的示例代码

我需要为运行 SQL Server 2005 的遗留应用程序生成 XML,我希望使用 FOR XML 函数。

但是,当左外连接返回 null 时,我似乎无法摆脱空元素。

我在下面创建了一些测试数据。

我得到的结果(自动):

<n id="1" Name="test1">
  <s SubName="sub1" />
  <s SubName="sub2" />
</n>
<n id="2" Name="test2">
  <s />
</n>

我得到的结果(RAW):

<row id="1" Name="test1" SubName="sub1" />
<row id="1" Name="test1" SubName="sub2" />
<row id="2" Name="test2" />

我想要的结果:

<n id="1" Name="test1">
  <s SubName="sub1" />
  <s SubName="sub2" />
</n>
<n id="2" Name="test2" />

测试代码:

IF OBJECT_ID('tempdb..#name') IS NOT NULL BEGIN DROP TABLE #name END
SELECT * INTO #name FROM (
SELECT 1 id, 'test1' Name UNION ALL
SELECT 2 id, 'test2' Name )t

IF OBJECT_ID('tempdb..#sub') IS NOT NULL BEGIN DROP TABLE #sub END
SELECT * INTO #sub FROM (
SELECT 1 id, 'sub1' SubName UNION ALL
SELECT 1 id, 'sub2' SubName )t

SELECT n.id
     , n.Name
     , s.SubName 
FROM #name n
LEFT OUTER JOIN #sub s ON s.id = n.id
FOR XML AUTO

SELECT n.id
     , n.Name
     , s.SubName
FROM #name n
LEFT OUTER JOIN #sub s ON s.id = n.id
FOR XML RAW

最佳答案

似乎子查询与 PATH 或 RAW 相结合是简单的答案。两者都可以产生所需的结果:

路径:

SELECT n.id "@id"
     , n.Name "@Name"
     , (SELECT s.SubName "@SubName"
        FROM #sub s WHERE s.id = n.id
        FOR XML PATH('s'), TYPE
        ) 
FROM #name n
FOR XML PATH('n')

原始:

SELECT n.id 
     , n.Name 
     , (SELECT s.SubName 
        FROM #sub s WHERE s.id = n.id
        FOR XML RAW('s'), TYPE
        ) 
FROM #name n
FOR XML RAW('n')

关于sql-server - 在 SQL Server : how do I remove empty elements from nested elements when LEFT OUTER JOIN'ing 中使用 FOR XML AUTO 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48185801/

有关sql-server - 在 SQL Server : how do I remove empty elements from nested elements when LEFT OUTER JOIN'ing 中使用 FOR XML AUTO 时的更多相关文章

随机推荐