sql >> Databasteknik >  >> RDS >> Sqlserver

Hur skickar jag en variabel som innehåller en lista till en dynamisk SQL-fråga?

Helt enkelt

EXECUTE ('select id from  [dbo].[CSVToTable] ('''[email protected]+''')')
        declare @listOfIDs varchar(1000);

Eller vilket är det bättre sättet

SET @listOfIDs = '5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61'; 

EXECUTE sp_executesql N'select id from  [dbo].[CSVToTable] (@listOfIDs)',
                      N'@listOfIDs VARCHAR(1000)',
                      @listOfIDs;
  • Varför får jag det här felet?

Eftersom du verkligen skickar för många parametrar, mer än vad som behövs, för att förstå detta, kör den här frågan och se vad du verkligen är skicka till din funktion

SELECT 'select id from  [dbo].[CSVToTable] ('[email protected]+')';

som kommer tillbaka (och det här är vad du verkligen försöker utföra)

select id from  [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)

istället för (vilket är vad du behöver)

SELECT 'select id from  [dbo].[CSVToTable] ('''[email protected]+''')';
  • Ok, men varför sp_executesql är bättre än exec ?

Helt enkelt EXEC kommer att tvinga dig att sammanfoga alla dina variabler i en enda sträng, det är det värsta med det, och det gör din kod helt öppen för SQL-injektion . Se code>Dåliga vanor att sparka :Använder EXEC() istället för sp_executesql , betyder det inte att sp_executesql är 100 % säker, men den tillåter att uttalanden parameteriseras medan EXEC() gör det inte, därför är det säkrare än EXEC när det gäller SQL-injektion .

Slutligen, eftersom du taggar och du inte anger versionen föreslår jag att du använder SPLIT_STRING() funktion (2016+) snarare än din, och om du inte har 2016+ version, skapa din egen utan att använda WHILE loop för att få bättre prestanda, orsaka WHILE loop kommer att fungera långsamt, så du bör undvika det.

Exempel:



  1. Kan jag använda frågespråk i viloläge för enheter som inte är mappade till en tabell?

  2. Grundläggande tabelluttryck, del 7 – CTE:er, optimeringsöverväganden

  3. Sätt som tillgång kan spara pengar för ditt företag

  4. SQLite DROP VIEW