在SQL Server中运行循环

时间:2014-01-24 21:34:07

标签: sql-server stored-procedures

我想通过SELECT查询在每个ID返回上运行存储过程。是否有一种简单的方法可以执行以下操作:

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

3 个答案:

答案 0 :(得分:1)

因为我昨天碰巧回答了一个非常similar question,所以我有这个代码很方便。正如其他人所说,它可能不是最好的方法,但仍然很高兴学习如何使用while循环。

假设一个名为“Customer”的表

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

答案 1 :(得分:0)

这里有两个选项

选项1使用拆分功能

传递逗号分隔的ID列表并使用“拆分”功能在“过程”中对这些值进行拆分并对其执行任何操作。

  

要   让它工作你需要两件事

     

1)创建一个函数   接受逗号删除字符串并将其拆分。

     

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

修改你这样的程序

存储过程

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表类型参数

创建一个表类型并更改你的proc以接受一个表类型参数,并在你的proc中做你想做的任何事情。

表类型

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

接受该类型参数的存储过程

 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 

答案 2 :(得分: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;