Tyvärr är detta en opålitlig metod för strängsammansättning i SQL Server. Jag skulle undvika det i alla utom de mest triviala fall. Det finns lite mer information i denna KB:Utförandeplan och resultat av sammanfogade sammanfogningsfrågor beror på Uttrycksplats .
Som sagt, jag kunde både duplicera ditt problem och tillhandahålla en lösning i min miljö:
SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables
Lägg märke till att jag har lagt till en tom ersätt-funktion till uttrycket. Även om det inte borde göra något med utdata, lägger det till en lokal "beräkna skalärt" steg till frågeplanen. Detta verkar dra tillbaka all data från namnkolumnen för att sedan bearbetas lokalt istället för att bara låta fjärrfrågan returnera vad den tror behövs.
Jag är inte säker på om det finns en bättre funktion att använda än en replace
med tomma argument. Kanske en dubbel reverse
eller något. Se bara till att casta till en maxdatatyp om det behövs som dokumentationen anger.
UPPDATERA
Deklarerar helt enkelt @var
som varchar(max)
snarare än nvarchar(max)
löser problemet, eftersom det sedan tar tillbaka hela namnkolumnen (skriv sysname -- eller nvarchar(128) -- tror jag) för lokal bearbetning precis som ersätt-funktionen gjorde. Jag kan inte låtsas veta vilken kombination av länkade serverinställningar
och implicit gjutning gör att detta kommer upp. Förhoppningsvis kan någon med mer kunskap inom detta område höra av sig!