我正在运行以下查询:
DECLARE @sql NVARCHAR(max) = N''
SELECT @sql += N' EXEC dbo.DoSomething @Tablename = ''' + SCHEMA_NAME(T.schema_id) + N'.' + T.name + N''''
--SELECT *
FROM sys.tables T
INNER JOIN sys.indexes I ON I.object_id = T.object_id
ORDER by 1
PRINT @sql
但我只打印了一行。如果我取出这ORDER by 1
条线,或者用它替换它,
ORDER BY t.name
我就会得到预期的结果。
这是 SQL Server 中的错误吗?
我已经在 SQL SErver 2016 SP1 和 2014 Sp2-Cu1 上试过了。
不。
来自PRB:聚合串联查询的执行计划和结果取决于表达式位置
另请参阅Martin Smith在 stackoverflow 上的出色回答。 nvarchar 连接/索引/nvarchar(max) 莫名其妙的行为
有时有效,有时无效,这取决于执行计划。如果执行连接的计算标量被定位为选择运算符下方的第一个运算符,那么魔法就会起作用。
但如果你运气不好,你可能会得到不同的计划。这个在选择和计算标量之间有一个排序运算符。
解决此问题的最佳方法(在我看来)是使用
for xml path
来进行串联。将来的某些版本的 SQL Server 将具有内置的字符串聚合函数STRING_AGG (Transact-SQL)。