Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que recebo esses resultados diferentes de duas consultas SQL?


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!