Estou executando a seguinte consulta:
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
Mas estou imprimindo apenas uma linha. Se eu retirar a ORDER by 1
linha ou substituí-la por
ORDER BY t.name
, obtenho o resultado esperado.
Isso é um bug no SQL Server?
Eu tentei no SQL SErver 2016 SP1 e 2014 Sp2-Cu1.
Não.
Do PRB: o plano de execução e os resultados das consultas de concatenação agregada dependem do local da expressão
Veja também esta excelente resposta de Martin Smith no stackoverflow. concatenação nvarchar/índice/nvarchar(max) comportamento inexplicável
Às vezes funciona e às vezes não funciona e isso depende do plano de execução. A mágica funciona se o escalar de computação que faz a concatenação estiver posicionado como o primeiro operador abaixo do operador de seleção.
Mas se você não tiver sorte, pode acabar com um plano diferente. Este tem um operador de classificação entre o select e o escalar de computação.
A melhor maneira de resolver isso (na minha opinião) é usar
for xml path
para fazer a concatenação.Algumas versões do SQL Server no futuro terão uma função de agregação de string incorporada STRING_AGG (Transact-SQL) .