我在合并方面有一些非常奇怪的行为。当我没有指定返回金额(TOP(50))时,我只会得到一个最后结果,但如果我删除“排序依据”,它就会起作用......下面的示例
DECLARE @result varchar(MAX)
SELECT @result = COALESCE(@result + ',', '') + [Title]
FROM Episodes WHERE [SeriesID] = '1480684' AND [Season] = '1' Order by [Episode] ASC
SELECT @result
只会返回一个最后结果:
湿婆碗
但是如果我指定最大返回金额(仅添加TOP (50)相同的声明)
DECLARE @result varchar(MAX)
SELECT TOP(50) @result = COALESCE(@result + ',', '') + [Title]
FROM Episodes WHERE [SeriesID] = '1480684' AND [Season] = '1' Order by [Episode] ASC
SELECT @result
我以正确的顺序得到所有结果
选秀,弹跳测试,周日在如心,先生。麦吉布茨、通常的赌注、湿婆碗
罪魁祸首似乎是 [Title] 列,就好像我返回了一个不同的列,它似乎在没有指定返回限制的情况下工作。仅供参考 [Title] 是一个 VARCHAR(MAX) NOT NULL 列。
有什么见解可能导致此情况吗?我真的不想设置限制,但这是目前返回所有数据的唯一方法......谢谢
你不能依赖像这样的串联:
SELECT @result = COALESCE(@result + ',', '') + [Title]
FROM Episodes
...
聚合串联查询的执行计划和结果取决于表达式位置
取决于 CTE/临时表/执行计划的示例,您将得到不同的结果:
SqlFiddle演示
DECLARE @text VARCHAR(MAX) = ''
,@text2 VARCHAR(MAX) = '';
SELECT CAST(ROW_NUMBER() OVER (ORDER BY name) AS INT) AS number
INTO #numbers
FROM master..spt_values
;WITH numbers (number)
AS
(
SELECT CAST(ROW_NUMBER() OVER (ORDER BY name) AS INT) AS number
FROM master..spt_values
),a AS
(
SELECT number FROM numbers WHERE number < 10
)
SELECT @text = @text + LTRIM(STR(a.number))
FROM a
ORDER BY a.number DESC
;WITH numbers (number)
AS
(
SELECT number FROM #numbers
),
a
AS
(
SELECT number FROM numbers WHERE number < 10
)
SELECT @text2 = @text2 + LTRIM(STR(a.number))
FROM a
ORDER BY a.number DESC
SELECT @text, @text2;
我制作了示例,您的第一个查询正在运行SqlFiddle演示。但你的解决方案高度依赖于执行计划。
Use XML + 东西改为串联。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)