sql >> Databáze >  >> RDS >> Sqlserver

Proč získám tyto různé výsledky ze dvou SQL dotazů?

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í!




  1. Kde je můj neplatný znak (ORA-00911)

  2. CHYBA! Server skončil bez aktualizace souboru PID (/usr/local/mysql/data/Mac.local.pid)

  3. SELECT COUNT(*) je pomalý, dokonce i s klauzulí where

  4. Problém s použitím ROW_NUMBER() OVER (PARTITION BY...)