sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor får jeg disse forskellige resultater fra to SQL-forespørgsler?

Desværre er dette en upålidelig metode til strengsammenkædning i SQL Server. Jeg ville undgå det i alle undtagen de mest trivielle tilfælde. Der er nogle flere oplysninger i denne KB:Udførelsesplan og resultater af aggregerede sammenkædningsforespørgsler afhænger af Udtryksplacering .

Når det er sagt, var jeg i stand til både at duplikere dit problem og give en løsning i mit miljø:

SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables

Bemærk, at jeg har tilføjet en tom erstatningsfunktion til udtrykket. Selvom det ikke burde gøre noget ved outputtet, tilføjer det en lokal "beregn skalar" trin til forespørgselsplanen. Dette ser ud til at trække alle data tilbage fra navnekolonnen for derefter at blive behandlet lokalt i stedet for blot at lade fjernforespørgslen returnere, hvad den mener er nødvendig.

Jeg er ikke sikker på, om der er en bedre funktion at bruge end en replace med tomme argumenter. Måske en dobbelt reverse eller noget. Bare sørg for at caste til en max datatype, hvis det er nødvendigt, som dokumentationen angiver.

OPDATERING

Du skal blot erklære @var som varchar(max) i stedet for nvarchar(max) løser problemet, da det så bringer hele navnekolonnen tilbage (skriv sysname -- eller nvarchar(128) -- tror jeg) til lokal behandling ligesom erstatningsfunktionen gjorde. Jeg kan ikke foregive at vide, hvilken kombination af linkede serverindstillinger og implicit casting får dette til at komme op. Forhåbentlig kan nogen med mere viden på dette område melde sig!




  1. Formatering af output af forespørgsler i SQLPlus

  2. Opdater værdier fra MYSQL-tabellen uden at genindlæse siden?

  3. Mysql group_concat af gentagne nøgler og antal gentagelser af flere kolonner i 1 forespørgsel (Query Optimization)

  4. Vil du kombinere to forespørgsler for at kontrollere for dubletter i MySQL?