2014-01-24 4 views
0

Я хочу запустить хранимую процедуру при каждом возврате идентификатора по запросу SELECT. Есть простой способ сделать что-то вроде:Запуск цикла в SQL Server

FOREACH (SELECT ID FROM myTABLE WHERE myName='bob') AS id 
BEGIN 
    EXEC @return_value = [dbo].[spMYPROC] 
     @PARAM1 = id 
     @PARAM2 = 0 
END 
+4

Вместо того, чтобы пытаться делать какие-то зацикливание на столе, то почему бы не пройти в идентификаторах хранимой процедуры? – TTeeple

+2

Согласовано с @TTeeple - измените хранимую процедуру для обработки всех строк в 'myTABLE' вместо одной процедуры, которую вы называете N раз. Налицо существенные накладные расходы, не говоря уже о вызове хранимой процедуры каждый раз. SQL Server оптимизирован для работы с наборами. Вы хотите что-то сделать в своей процедуре для каждой строки в наборе, но вы действительно должны изменить ее, чтобы делать все, что угодно, для всех строк сразу. Если вы покажете тело своей процедуры, мы можем помочь вам в этом. –

+0

Отметьте это сообщение, он делает что-то очень похожее: [Выполняйте хранимую процедуру несколько раз динамически] (http://stackoverflow.com/questions/21333405/run-a-stored-procedure-multiple-times-dynamicly/21335138# 21335138) – agileMike

ответ

0

У вас есть две опции здесь

Вариант 1 Использование Функция Split

Pass запятой deliminated список идентификаторов и использовать Разделить функции внутри ваша Процедура, чтобы разделить эти значения и сделать все, что вы хотите с ней сделать.

Чтобы Сделать работу вам понадобятся две вещи

1) создать функцию, которая принимает строку Comma Deliminated и разделить их.

2) Изменение вам процедуры сохранения и добавить эту функцию там в пути, который прошел параметр передается в функцию внутри этой процедуры магазина и , которые функционируют расколоть значения перед передачей его на вашу процедуру магазина .

Создать эту функцию 1-й

Функция Определение

CREATE FUNCTION [dbo].[FnSplit] 
(
@List nvarchar(2000), 
@SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table (Id int identity(1,1), Value nvarchar(100)) 
AS 
BEGIN 

WHILE(Charindex(@SplitOn,@List)>0) 

    BEGIN 


     INSERT INTO @RtnValue (value) 

     SELECT VALUE = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 

     SET @List = SUBSTRING(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List)) 

    END 


INSERT INTO @RtnValue (Value) 

SELECT VALUE = ltrim(rtrim(@List)) 

RETURN 

END 

Modify вас strored Процедура что-то вроде этого

хранимая процедура

ALTER Procedure [dbo].[spMYPROC] (@Param1 VARCHAR(1000)= NULL) 
AS 
BEGIN 

     SELECT * FROM TableName 
     where ColumnNAME IN (SELECT Value FROM dbo.FnSplit(@Param1,',')) 

END 
GO 

Вариант 2 Таблица Параметр Тип

Создать тип таблицы и изменить свой процедурный принять Таблица Тип параметра и делать все, что вы хотите сделать с ними значения внутри прок.

ТАБЛИЦА ТИПА

CREATE TYPE dbo.TYPENAME AS TABLE 
(
    Value int 
) 
GO 

хранимых процедур, чтобы принимать этот тип Param

ALTER PROCEDURE [dbo].[spMYPROC] 
@TableParam TYPENAME READONLY 
AS 
    BEGIN 
    SET NOCOUNT ON; 
    --Temp table to store passed Id values 
    declare @tmp_values table (value INT); 

    --Insert passed values to a table variable inside the proc 

    INSERT INTO @tmp_values (value) 
    SELECT Value FROM @TableParam 

    /* Do your stuff here whatever you want to do with Ids */ 

END 

EXECUTE PROC

Объявите переменную этого типа и заполнить его с вашим значения.

DECLARE @Table TYPENAME  --<-- Variable of this TYPE 

INSERT INTO @Table    --<-- Populating the variable 
SELECT ID FROM myTABLE WHERE myName='bob' 

EXECUTE [dbo].[spMYPROC] @Table --<-- Stored Procedure Executed 
0
DECLARE @ID INT, @return_value INT 

DECLARE c CURSOR FOR 
SELECT 
    ID 
FROM myTABLE 
WHERE myName = 'bob' 

OPEN c; FETCH NEXT FROM c INTO @ID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC @return_value = [dbo].[spMYPROC] 
     @PARAM1 = @ID, 
     @PARAM2 = 0 

    FETCH NEXT FROM c INTO @ID 
END 

CLOSE c; DEALLOCATE c; 
0

Так как я только что произошло, чтобы ответить на очень similar question вчера, у меня есть этот код под рукой. Как утверждали другие, это может быть не самый лучший подход, но все же приятно научиться использовать цикл while в любом случае.

Предполагая, что таблица с именем «Клиент»

declare @Id int 

select @Id = MIN(Id) 
from Customer c 


while(select COUNT(1) 
     from Customer c 
     where c.Id >= @Id) > 0 
    begin 

     --run your sproc right here 

     select @Id = MIN(Id) 
     from Customer c 
     where c.Id > @Id 


    end 
Смежные вопросы