Infelizmente, esse é um método não confiável de concatenação de strings no SQL Server. Eu o evitaria em todos os casos, exceto nos mais triviais. Há mais algumas informações neste KB:Plano de execução e resultados de consultas de concatenação agregada dependem Localização da expressão .
Dito isso, consegui duplicar seu problema e fornecer uma solução alternativa no meu ambiente:
SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables
Observe que adicionei uma função de substituição vazia à expressão. Embora não deva fazer nada na saída, ele adiciona um local etapa "computar escalar" para o plano de consulta. Isso parece recuperar todos os dados da coluna de nome para serem processados localmente, em vez de apenas permitir que a consulta remota retorne o que acha necessário.
Não tenho certeza se há uma função melhor para usar além de um
replace
com argumentos vazios. Talvez um duplo reverse
ou alguma coisa. Apenas certifique-se de converter para um tipo de dados máximo, se necessário, conforme afirma a documentação. ATUALIZAÇÃO
Simplesmente declarando
@var
como varchar(max)
em vez de nvarchar(max)
resolve o problema, pois traz de volta toda a coluna de nome (digite sysname - ou nvarchar (128) - acredito) para processamento local, assim como a função de substituição. Não posso fingir saber qual combinação de configurações do servidor vinculado
e a conversão implícita faz com que isso apareça. Espero que alguém com mais conhecimento nesta área possa contribuir!