Helt enkelt
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
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] ('example@sqldat.com+')';
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] ('''example@sqldat.com+''')';
- 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: