使用 Order By 时 COALESCE 的奇怪 TSQL 行为
Strange TSQL behavior with COALESCE when using Order By
我在使用 coalesce 时遇到了一些非常奇怪的行为。当我没有指定 return 金额(TOP (50))时,我只会得到一个最后的结果,但是如果我删除 "Order By" 它会起作用......下面的例子
DECLARE @result varchar(MAX)
SELECT @result = COALESCE(@result + ',', '') + [Title]
FROM Episodes WHERE [SeriesID] = '1480684' AND [Season] = '1' Order by [Episode] ASC
SELECT @result
只会return一个最后的结果:
The Shiva Bowl
但如果我指定最大 return 金额(仅将 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
我按正确顺序得到所有结果
The Draft,The Bounce Test,Sunday at Ruxin's,Mr. McGibblets,The Usual Bet,The Shiva Bowl
罪魁祸首似乎是 [Title] 列,就好像我 return 一个不同的列一样,它似乎在没有指定 return 限制的情况下工作。仅供参考 [Title] 是 VARCHAR(MAX) NOT NULL 列。
知道是什么原因造成的吗?我真的不想设置限制,但这是目前 return 处理所有数据的唯一方法...谢谢
您不能像这样依赖串联:
SELECT @result = COALESCE(@result + ',', '') + [Title]
FROM Episodes
...
Execution Plan and Results of Aggregate Concatenation Queries Depend Upon Expression Location
示例取决于 CTE/temp table/execution 计划你会得到不同的结果:
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;
我制作了示例,您的第一个查询有效 SqlFiddleDemo。但是您的解决方案高度依赖于执行计划。
改为使用 XML + STUFF 进行串联。
我在使用 coalesce 时遇到了一些非常奇怪的行为。当我没有指定 return 金额(TOP (50))时,我只会得到一个最后的结果,但是如果我删除 "Order By" 它会起作用......下面的例子
DECLARE @result varchar(MAX)
SELECT @result = COALESCE(@result + ',', '') + [Title]
FROM Episodes WHERE [SeriesID] = '1480684' AND [Season] = '1' Order by [Episode] ASC
SELECT @result
只会return一个最后的结果:
The Shiva Bowl
但如果我指定最大 return 金额(仅将 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
我按正确顺序得到所有结果
The Draft,The Bounce Test,Sunday at Ruxin's,Mr. McGibblets,The Usual Bet,The Shiva Bowl
罪魁祸首似乎是 [Title] 列,就好像我 return 一个不同的列一样,它似乎在没有指定 return 限制的情况下工作。仅供参考 [Title] 是 VARCHAR(MAX) NOT NULL 列。
知道是什么原因造成的吗?我真的不想设置限制,但这是目前 return 处理所有数据的唯一方法...谢谢
您不能像这样依赖串联:
SELECT @result = COALESCE(@result + ',', '') + [Title]
FROM Episodes
...
Execution Plan and Results of Aggregate Concatenation Queries Depend Upon Expression Location
示例取决于 CTE/temp table/execution 计划你会得到不同的结果:
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;
我制作了示例,您的第一个查询有效 SqlFiddleDemo。但是您的解决方案高度依赖于执行计划。
改为使用 XML + STUFF 进行串联。