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 änexec
?
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 sql-server
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: