Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да предам променлива, която съдържа списък, към динамична SQL заявка?

Просто

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 инжекция .

И накрая, тъй като маркирате и не посочите версията, предлагам да използвате SPLIT_STRING() функция (2016+) rathar от вашата и ако нямате версия 2016+, създайте своя собствена, без да използвате WHILE цикъл за постигане на по-добра производителност, причина WHILE цикълът ще работи бавно, затова трябва да го избягвате.

Примери:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на номера на седмицата от дата в SQL Server (T-SQL)

  2. Функции на прозореца - Работно общо с нулиране

  3. Как мога да изброя всички външни ключове, препращащи към дадена таблица в SQL Server?

  4. Невъзможност за отдалечен достъп до екземпляр на SQL Server 2008 R2

  5. Неуспешно изпълнение на SSRS заявка за набор от данни