Выполнить хранимую процедуру в операторе SELECT - PullRequest
4 голосов
/ 04 апреля 2009

Для экземпляра я оператор выбора, и он возвращает 1000 строк. Мне нужно выполнить определенную хранимую процедуру для каждой строки, которую возвращает оператор select.

Есть ли у вас какие-либо идеи, как я могу это сделать?

Ответы [ 4 ]

12 голосов
/ 04 апреля 2009

Создайте операторы EXECUTE в вашем выборе следующим образом:

SELECT 'EXEC sp_whatever ' + parameter stuff
FROM   your_table

Тогда запустите результаты! Или вставьте результаты в пакет электронных таблиц и используйте конкатенацию строк для построения операторов EXEC - просто создайте формулу и вставьте ее в 1000 строк. Я лично предпочитаю первый подход.

Чтобы прояснить «материал параметра», возьмите пример хранимой процедуры, которая принимает два int параметра, которые вы хотите взять из столбцов, которые вы your_table. Тогда у вас будет что-то вроде этого:

SELECT 'EXEC sp_whatever ' + CAST(field1 AS varchar) + ', ' + CAST(field2 AS varchar)
FROM    your_table

Здесь нет необходимости быть осторожным со строковыми полями - вы рискуете непреднамеренно подвергнуть себя собственной атаке SQL-инъекции, как и при любой конкатенации строк SQL.

Я читаю ваше «для примера» как «это разовая задача». Если это задача, требующая автоматизации, один из других ответов может быть правильным подходом.

2 голосов
/ 02 мая 2014

Вы можете сделать это так:

declare @execstatementsbatch nvarchar(max)

select @execstatementsbatch = ''

SELECT @execstatementsbatch = @execstatementsbatch   + 'EXEC UpdateQty ' + ItemCode +  ', '  + QtyBO +  '; ' 
FROM ITEMSPO 
INNER JOIN ..... 
<some conditions>

exec(@execstatementsbatch)
2 голосов
/ 04 апреля 2009

Отказ от ответственности: я не уверен, правильно ли я понимаю ваш вопрос.

Если вы работаете с SQL Server 2005 и выше, вы можете создать пользовательскую функцию с табличным значением и использовать в своем запросе оператор OUTER APPLY .

1 голос
/ 04 апреля 2009

Большинство СУБД позволяет вам выбирать строки из наборов результатов хранимых процедур. Просто поместите ваши хранимые процедуры в предложение FROM, как для обычных табличных выражений. Например:

SELECT sp.ColumnInResultSet, t.BaseTableColumnName
FROM sp_whatever ( Args) sp INNER JOIN BaseTable t ON t.ID = sp.ID;
...