sql >> Databasteknik >  >> RDS >> Sqlserver

Varför får jag dessa olika resultat från två SQL-frågor?

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!




  1. MySQL Type=MyISAM-fel

  2. Allvarligt fel påträffades under kommandoexekveringen. i C# när jag använder Insert Into

  3. Spåra sidvisningar med PHP

  4. Snabbaste OLEDB-läsning från ORACLE