Helaas is dit een onbetrouwbare methode voor het samenvoegen van tekenreeksen in SQL Server. Ik zou het in alle, behalve de meest triviale gevallen, vermijden. Deze KB bevat meer informatie:Uitvoeringsplan en resultaten van samengevoegde aaneenschakelingsquery's zijn afhankelijk van Expressielocatie .
Dat gezegd hebbende, kon ik zowel uw probleem dupliceren als een tijdelijke oplossing bieden in mijn omgeving:
SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables
Merk op dat ik een lege vervangfunctie aan de uitdrukking heb toegevoegd. Hoewel het niets aan de uitvoer zou moeten doen, voegt het wel een lokaal toe "reken scalaire" stap naar het queryplan. Dit lijkt alle gegevens uit de naamkolom terug te halen om vervolgens lokaal te worden verwerkt in plaats van alleen de externe query te laten retourneren wat hij denkt dat nodig is.
Ik weet niet zeker of er een betere functie is dan een replace
met lege argumenten. Misschien een dubbele reverse
of zoiets. Zorg er wel voor dat u indien nodig naar een max datatype cast, zoals in de documentatie staat.
UPDATE
Gewoon @var
. declareren als varchar(max)
in plaats van nvarchar(max)
lost het probleem op, omdat het dan de hele naamkolom terugbrengt (type sysname - of nvarchar (128) - geloof ik) voor lokale verwerking, net zoals de functie Replace deed. Ik kan niet doen alsof ik weet welke combinatie van gekoppelde serverinstellingen
en impliciete casting zorgt ervoor dat dit naar voren komt. Hopelijk kan iemand met meer kennis op dit gebied inhaken!