За съжаление, това е ненадежден метод за конкатенация на низове в SQL Server. Бих го избягвал във всички случаи, освен в най-тривиалните. Има малко повече информация в тази KB:Планът за изпълнение и резултатите от обобщените конкатенационни заявки зависят от Местоположение на израз .
Въпреки това успях както да дублирам вашия проблем, така и да осигуря заобиколно решение в моята среда:
SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables
Забележете, че добавих празна функция за замяна към израза. Въпреки че не трябва да прави нищо на изхода, той добавя локален стъпка "изчисляване на скалар" към плана на заявката. Това изглежда изтегля обратно всички данни от колоната с име, за да бъдат обработени локално, вместо просто да остави отдалечената заявка да върне това, което смята, че е необходимо.
Не съм сигурен дали има по-добра функция за използване освен replace
с празни аргументи. Може би двойно reverse
или нещо. Просто не забравяйте да прехвърлите към максимален тип данни, ако е необходимо, както се посочва в документацията.
АКТУАЛИЗАЦИЯ
Просто деклариране на @var
като varchar(max)
вместо nvarchar(max)
изчиства проблема, тъй като след това връща цялата колона с име (напишете sysname -- или nvarchar(128) -- вярвам) за локална обработка, точно както направи функцията за замяна. Не мога да се преструвам, че знам коя комбинация от настройки на свързания сървър
и имплицитното кастинг причинява това да се появи. Надяваме се, че някой с повече познания в тази област може да се включи!