Desværre er dette en upålidelig metode til strengsammenkædning i SQL Server. Jeg ville undgå det i alle undtagen de mest trivielle tilfælde. Der er nogle flere oplysninger i denne KB:Udførelsesplan og resultater af aggregerede sammenkædningsforespørgsler afhænger af Udtryksplacering .
Når det er sagt, var jeg i stand til både at duplikere dit problem og give en løsning i mit miljø:
SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables
Bemærk, at jeg har tilføjet en tom erstatningsfunktion til udtrykket. Selvom det ikke burde gøre noget ved outputtet, tilføjer det en lokal "beregn skalar" trin til forespørgselsplanen. Dette ser ud til at trække alle data tilbage fra navnekolonnen for derefter at blive behandlet lokalt i stedet for blot at lade fjernforespørgslen returnere, hvad den mener er nødvendig.
Jeg er ikke sikker på, om der er en bedre funktion at bruge end en replace
med tomme argumenter. Måske en dobbelt reverse
eller noget. Bare sørg for at caste til en max datatype, hvis det er nødvendigt, som dokumentationen angiver.
OPDATERING
Du skal blot erklære @var
som varchar(max)
i stedet for nvarchar(max)
løser problemet, da det så bringer hele navnekolonnen tilbage (skriv sysname -- eller nvarchar(128) -- tror jeg) til lokal behandling ligesom erstatningsfunktionen gjorde. Jeg kan ikke foregive at vide, hvilken kombination af linkede serverindstillinger
og implicit casting får dette til at komme op. Forhåbentlig kan nogen med mere viden på dette område melde sig!