Просто
EXECUTE ('select id from [dbo].[CSVToTable] ('''[email protected]+''')')
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] ('[email protected]+')';
което ще се върне (и това е, което наистина се опитвате да изпълните)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
вместо (което ви трябва)
SELECT 'select id from [dbo].[CSVToTable] ('''[email protected]+''')';
- Добре, но защо
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
цикълът ще работи бавно, затова трябва да го избягвате.
Примери: