Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum erhalte ich diese unterschiedlichen Ergebnisse aus zwei SQL-Abfragen?

Leider ist dies eine unzuverlässige Methode der Zeichenfolgenverkettung in SQL Server. Ich würde es in allen außer den trivialsten Fällen vermeiden. In dieser KB finden Sie weitere Informationen:Ausführungsplan und Ergebnisse von aggregierten Verkettungsabfragen hängen von ab Ausdrucksort .

Trotzdem konnte ich Ihr Problem duplizieren und in meiner Umgebung eine Problemumgehung bereitstellen:

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

Beachten Sie, dass ich dem Ausdruck eine leere Ersetzungsfunktion hinzugefügt habe. Obwohl es nichts mit der Ausgabe tun sollte, fügt es ein local hinzu "Skalar berechnen"-Schritt zum Abfrageplan. Dies scheint alle Daten aus der Namensspalte zurückzuziehen, um sie dann lokal zu verarbeiten, anstatt nur die entfernte Abfrage zurückzugeben, was ihrer Meinung nach benötigt wird.

Ich bin mir nicht sicher, ob es eine bessere Funktion gibt als einen replace mit leeren Argumenten. Vielleicht eine doppelte reverse oder so. Stellen Sie nur sicher, dass Sie bei Bedarf in einen maximalen Datentyp umwandeln, wie in der Dokumentation angegeben.

AKTUALISIEREN

Einfach @var deklarieren als varchar(max) statt nvarchar(max) klärt das Problem, da es dann die gesamte Namensspalte (Typ sysname -- oder nvarchar (128) -- glaube ich) für die lokale Verarbeitung zurückbringt, genau wie die Ersetzungsfunktion. Ich kann nicht vorgeben zu wissen, welche Kombination von Linked-Server-Einstellungen und implizites Casting bewirkt, dass dies auftaucht. Hoffentlich kann sich jemand mit mehr Wissen auf diesem Gebiet melden!