【发布时间】:2019-09-03 20:45:18
【问题描述】:
我遇到了一个 SQL 查询问题,该查询旨在将结果数据作为 XML 返回。这是一个代码转储,向您展示发生了什么:
SQL 查询(注意:表名和列名已编辑)
with resultdata as
(
SELECT
(
select * from Table1 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
) as tabledata
UNION ALL
SELECT
(
select * from Table2 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
)
UNION ALL
SELECT
(
select * from Table3 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
)
UNION ALL
SELECT
(
select * from Table4 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
)
UNION ALL
SELECT
(
select * from Table5 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
)
UNION ALL
SELECT
(
select * from Table6 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
)
UNION ALL
SELECT
(
select * from Table7 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
)
UNION ALL
SELECT
(
select * from Table8 (nolock)
where column1 = 99999 and column2 = -1 for xml auto, type
)
)
select * from resultdata result for xml auto, elements
这将返回如下所示的 XML 结果(大部分 XML 已编辑,cmets 是实际数据所在的位置):
<result>
<tabledata>
<!--Table1 results-->
</tabledata>
</result>
<result>
<tabledata>
<!--Table2 results-->
</tabledata>
</result>
<result>
<tabledata>
<!--Table3 results-->
</tabledata>
</result>
<result>
<tabledata>
<!--Table4 results-->
</tabledata>
</result>
<result>
<tabledata>
<!--Table5 results-->
</tabledata>
</result>
<result>
<tabledata>
<!--Table6 results-->
</tabledata>
</result>
<result>
<tabledata>
<!--Table7 results-->
</tabledata>
</result>
<result>
<tabledata>
<!--Table8 results-->
</tabledata>
</result>
显然这是格式错误的 XML,但我似乎无法对其进行修改,以便它以正确的格式为我提供结果,如下所示:
<result>
<tabledata>
<!--Table1 results-->
</tabledata>
<tabledata>
<!--Table2 results-->
</tabledata>
<tabledata>
<!--Table3 results-->
</tabledata>
<tabledata>
<!--Table4 results-->
</tabledata>
<tabledata>
<!--Table5 results-->
</tabledata>
<tabledata>
<!--Table6 results-->
</tabledata>
<tabledata>
<!--Table7 results-->
</tabledata>
<tabledata>
<!--Table8 results-->
</tabledata>
</result>
附带说明,这是对我们现有查询的重写,这就是为什么语法大多是这样的原因。我的一位同事开始对其进行返工并基本上给了我在这里发布的内容,但是我一直在努力尝试使用他的更改使其正常工作。如果我需要废弃它并从头开始,我可以这样做。
另外,作为另一个说明,我希望它看起来像的 XML 必须是这种方式,因为它最终由我无法控制的 XSLT 使用。此查询的旧版本将每个 tabledata 元素作为不同的列名返回,然后在调用它的 C# 代码中进行字符串替换。对此 XML 进行多个字符串替换(可能超过 100k 行)存在性能问题,因此答案是更改查询以按照我们需要的方式返回数据。
【问题讨论】:
-
从所有子查询中删除“for xml auto, type”会产生错误:“当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。”我还尝试删除 auto 部分并只留下 xml,但这会产生语法错误。
-
什么在消耗这个 XML?可以将您得到的结果替换为“
”的所有实例吗? -
它是一个消耗它的 XSLT,但最终这就是我试图避免的字符串替换。当前的实现就是这样做的,而我的老板出于性能原因基本上希望将其删除。
标签: sql sql-server xml