Simpelthen
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
declare @listOfIDs varchar(1000);
Eller, hvilket er den bedste måde
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;
- Hvorfor får jeg denne fejl?
Fordi du virkelig sender for mange parametre, mere end det er nødvendigt, for at forstå dette, kør denne forespørgsel og se, hvad du egentlig er, videregive til din funktion
SELECT 'select id from [dbo].[CSVToTable] ('example@sqldat.com+')';
som vil vende tilbage (og det er det, du virkelig prøver at udføre)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
i stedet for (hvilket er hvad du har brug for)
SELECT 'select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')';
- Ok, men hvorfor
sp_executesqler bedre endexec?
Simpelthen EXEC vil tvinge dig til at sammenkæde alle dine variable i én enkelt streng, det er det værste ved det, og det gør din kode helt åben for SQL-injektion . Se Dårlige vaner at sparke:Brug af EXEC() i stedet for sp_executesql
, betyder det ikke, at sp_executesql er 100 % sikker, men det giver mulighed for at parameterisere udsagn mens EXEC() gør det ikke, derfor er det mere sikkert end EXEC med hensyn til SQL-injektion .
Endelig, siden du tagger
sql-server
og du ikke angiver versionen, foreslår jeg, at du bruger SPLIT_STRING()
funktion (2016+) rathar end din, og hvis du ikke har 2016+ version, så lav din egen uden at bruge WHILE loop for at opnå mere god ydeevne, forårsage WHILE loop vil fungere langsomt, så du bør undgå det.
Eksempler: