Toto je bohužel nespolehlivá metoda zřetězení řetězců v SQL Server. Vyhnul bych se tomu ve všech, kromě těch nejtriviálnějších případů. V této znalostní databázi jsou další informace:Plán provádění a výsledky agregovaných dotazů na zřetězení závisí na Umístění výrazu .
To znamená, že jsem byl schopen duplikovat váš problém a poskytnout řešení v mém prostředí:
SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables
Všimněte si, že jsem do výrazu přidal prázdnou funkci nahrazení. Ačkoli by to nemělo dělat nic s výstupem, přidává místní "výpočet skalární" krok k plánu dotazů. Zdá se, že to stáhne všechna data ze sloupce názvu, aby byla následně zpracována lokálně, místo aby vzdálený dotaz vrátil to, co považuje za potřebné.
Nejsem si jistý, zda existuje lepší funkce, kterou lze použít jinou než replace
s prázdnými argumenty. Možná dvojitý reverse
nebo něco. V případě potřeby se ujistěte, že přetypujete na maximální datový typ, jak uvádí dokumentace.
AKTUALIZACE
Jednoduše deklarujte @var
jako varchar(max)
spíše než nvarchar(max)
vyřeší problém, protože pak vrátí celý sloupec názvu (typ sysname -- nebo nvarchar(128) -- věřím) pro místní zpracování, stejně jako to udělala funkce nahrazení. Nemohu předstírat, která kombinace nastavení propojeného serveru
a implicitní casting způsobí, že to přijde. Doufejme, že se ozve někdo, kdo má v této oblasti více znalostí!