Gewoon
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
declare @listOfIDs varchar(1000);
Of, wat is de betere manier
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;
- Waarom krijg ik deze foutmelding?
Omdat je echt te veel parameters doorgeeft, meer dan nodig, om dit te begrijpen, voer je deze query uit en kijk je wat je echt doorgeeft aan je functie
SELECT 'select id from [dbo].[CSVToTable] ('example@sqldat.com+')';
die zal terugkeren (en dit is wat je echt probeert uit te voeren)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
in plaats van (wat je nodig hebt)
SELECT 'select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')';
- Ok, maar waarom
sp_executesqlis beter danexec?
Gewoon, EXEC zal je dwingen om al je variabelen samen te voegen tot één enkele string, dat is het ergste, en dat maakt je code volledig open voor SQL-injectie . Zie Bad Habits to Kick : Using EXEC() instead of sp_executesql
, betekent dit niet dat sp_executesql is 100% veilig, maar het staat toe dat verklaringen worden geparametriseerd terwijl EXEC() niet, daarom is het veiliger dan EXEC in termen van SQL-injectie .
Tot slot, aangezien u tagt
sql-server
en u de versie niet specificeert, raad ik u aan SPLIT_STRING()
functie (2016+) beter dan die van jou, en als je geen 2016+ versie hebt, maak dan je eigen zonder WHILE te gebruiken loop om meer goede prestaties te krijgen, oorzaak WHILE loop zal traag werken, dus je moet het vermijden.
Voorbeelden: