Просто
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
declare @listOfIDs varchar(1000);
Или кой е по-добрият начин
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;
- Защо получавам тази грешка?
Тъй като наистина предавате твърде много параметри, повече от необходимите, за да разберете това, изпълнете тази заявка и вижте какво всъщност представлявате предаването на вашата функция
SELECT 'select id from [dbo].[CSVToTable] ('example@sqldat.com+')';
което ще се върне (и това е, което наистина се опитвате да изпълните)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
вместо (което ви трябва)
SELECT 'select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')';
- Добре, но защо
sp_executesqlе по-добър отexec?
Просто EXEC ще ви принуди да свържете всичките си променливи в един единствен низ, това е най-лошото в случая и това прави кода ви напълно отворен за SQL инжектиране . Вижте Bad Habits to Kick : Using EXEC() instead of sp_executesql
, това не означава, че sp_executesql е 100% защитен, но позволява изразите да бъдат параметризирани докато EXEC() не, следователно е по-сигурен от EXEC по отношение на SQL инжекция .
И накрая, тъй като маркирате
sql-сървър
и не посочите версията, предлагам да използвате SPLIT_STRING()
функция (2016+) rathar от вашата и ако нямате версия 2016+, създайте своя собствена, без да използвате WHILE цикъл за постигане на по-добра производителност, причина WHILE цикълът ще работи бавно, затова трябва да го избягвате.
Примери: