Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché ottengo questi risultati diversi da due query SQL?

Sfortunatamente, questo è un metodo inaffidabile di concatenazione di stringhe in SQL Server. Lo eviterei in tutti i casi tranne che nel più banale. Sono disponibili ulteriori informazioni in questa Knowledge Base:Piano di esecuzione e risultati delle query di concatenazione aggregata dipendono da Posizione dell'espressione .

Detto questo, sono stato in grado di duplicare il tuo problema e fornire una soluzione alternativa nel mio ambiente:

SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables

Si noti che ho aggiunto una funzione di sostituzione vuota all'espressione. Anche se non dovrebbe fare nulla per l'output, aggiunge un locale passaggio "calcola scalare" al piano di query. Questo sembra recuperare tutti i dati dalla colonna del nome per poi essere elaborati localmente piuttosto che lasciare che la query remota restituisca ciò che ritiene necessario.

Non sono sicuro che esista una funzione migliore da utilizzare oltre a replace con argomenti vuoti. Forse un doppio reverse o qualcosa. Assicurati solo di eseguire il cast a un tipo di dati massimo, se necessario, come afferma la documentazione.

AGGIORNAMENTO

Semplicemente dichiarando @var come varchar(max) anziché nvarchar(max) risolve il problema, poiché riporta l'intera colonna del nome (digitare sysname - o nvarchar(128) - credo) per l'elaborazione locale proprio come ha fatto la funzione di sostituzione. Non posso pretendere di sapere quale combinazione di impostazioni del server collegato e il casting implicito fa sì che questo venga fuori. Speriamo che qualcuno con più conoscenze in questo settore possa intervenire!