sql >> Database >  >> RDS >> Sqlserver

Waarom krijg ik deze verschillende resultaten van twee SQL-query's?

Helaas is dit een onbetrouwbare methode voor het samenvoegen van tekenreeksen in SQL Server. Ik zou het in alle, behalve de meest triviale gevallen, vermijden. Deze KB bevat meer informatie:Uitvoeringsplan en resultaten van samengevoegde aaneenschakelingsquery's zijn afhankelijk van Expressielocatie .

Dat gezegd hebbende, kon ik zowel uw probleem dupliceren als een tijdelijke oplossing bieden in mijn omgeving:

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

Merk op dat ik een lege vervangfunctie aan de uitdrukking heb toegevoegd. Hoewel het niets aan de uitvoer zou moeten doen, voegt het wel een lokaal toe "reken scalaire" stap naar het queryplan. Dit lijkt alle gegevens uit de naamkolom terug te halen om vervolgens lokaal te worden verwerkt in plaats van alleen de externe query te laten retourneren wat hij denkt dat nodig is.

Ik weet niet zeker of er een betere functie is dan een replace met lege argumenten. Misschien een dubbele reverse of zoiets. Zorg er wel voor dat u indien nodig naar een max datatype cast, zoals in de documentatie staat.

UPDATE

Gewoon @var . declareren als varchar(max) in plaats van nvarchar(max) lost het probleem op, omdat het dan de hele naamkolom terugbrengt (type sysname - of nvarchar (128) - geloof ik) voor lokale verwerking, net zoals de functie Replace deed. Ik kan niet doen alsof ik weet welke combinatie van gekoppelde serverinstellingen en impliciete casting zorgt ervoor dat dit naar voren komt. Hopelijk kan iemand met meer kennis op dit gebied inhaken!




  1. Dynamische SQL - Controleer syntaxis en semantiek

  2. Toon de sortering in MariaDB

  3. Kan ik in een Oracle-trigger nieuw en oud toewijzen aan een rowtype-variabele?

  4. Meet databaseprestaties onder druk