Sql server 2005 如何迭代存储过程中的记录集?

Sql server 2005 如何迭代存储过程中的记录集?,sql-server-2005,tsql,stored-procedures,iteration,Sql Server 2005,Tsql,Stored Procedures,Iteration,我需要迭代存储过程中的记录集,并使用每个字段作为参数执行另一个存储过程。我无法在代码中完成此迭代。我在网上找到了样品,但它们似乎都是针对柜台的。我不确定我的问题是否与计数器有关。我需要foreach的T-SQL等价物 目前,我的第一个存储过程将其记录集存储在临时表mytemp中。我假设我将按如下方式调用辅助存储过程: while (something) execute nameofstoredprocedure arg1, arg2, arg3 end 您需要创建一个游标来循环记录集

我需要迭代存储过程中的记录集,并使用每个字段作为参数执行另一个存储过程。我无法在代码中完成此迭代。我在网上找到了样品,但它们似乎都是针对柜台的。我不确定我的问题是否与计数器有关。我需要foreach的T-SQL等价物

目前,我的第一个存储过程将其记录集存储在临时表mytemp中。我假设我将按如下方式调用辅助存储过程:

while (something)
    execute nameofstoredprocedure arg1, arg2, arg3
end

您需要创建一个游标来循环记录集

示例表:

CREATE TABLE Customers
(
    CustomerId INT NOT NULL PRIMARY KEY IDENTITY(1,1)
    ,FirstName Varchar(50) 
    ,LastName VARCHAR(40)
)

INSERT INTO Customers VALUES('jane', 'doe')
INSERT INTO Customers VALUES('bob', 'smith')
光标:

DECLARE @CustomerId INT, @FirstName VARCHAR(30), @LastName VARCHAR(50)

DECLARE @MessageOutput VARCHAR(100)

DECLARE Customer_Cursor CURSOR FOR 
    SELECT CustomerId, FirstName, LastName FROM Customers


OPEN Customer_Cursor 

FETCH NEXT FROM Customer_Cursor INTO
    @CustomerId, @FirstName, @LastName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @MessageOutput = @FirstName + ' ' + @LastName



    RAISERROR(@MessageOutput,0,1) WITH NOWAIT

    FETCH NEXT FROM Customer_Cursor INTO
    @CustomerId, @FirstName, @LastName
END
CLOSE Customer_Cursor
DEALLOCATE Customer_Cursor
这里有一个指向MSDN的链接,介绍如何创建它们

这就是我使用Raise Error而不是PRINT进行输出的原因。

尝试此无光标循环:

CREATE TABLE #Results  (RowID  int identity(1,1), Col1  varchar(5), Col2 int, ... )
DECLARE @Current  int
       ,@End      int
DECLARE @Col1  varchar(5)
       ,@Col2 int
       ,...

--you need to capture the result set from the primary stored procedure
INSERT INTO #Results
    (Col1, COl2,...)
    EXEC nameofstoredprocedure_1 arg1, arg2, arg3
SELECT @End=@@ROWCOUNT,@Current=0

--process each row in the result set
WHILE @Current<@End
BEGIN
    SET @Current=@Current+1

    SELECT
        @Col1=COl1, @Col2=Col2
        FROM #Results
        WHERE RowID=@Current

    --call the secondary procedure for each row
    EXEC nameofstoredprocedure_2  @Col1, @Col2,...

END

在SQL过程中循环行非常容易。你只需要使用光标。以下是一个例子:

让我们考虑一个具有50个记录的列名和年龄的表雇员,您必须执行一个存储过程,如TestPROC,它将记录每行的名称和年龄参数。

create procedure CursorProc
as
begin
   declare @count bigint;
   declare @age varchar(500)
   declare @name varchar(500)
   select @count = (select count(*) from employee)
   declare FirstCursor cursor for select name, age from employee
   open FirstCursor 
   while @count > 0
      begin
         fetch FirstCursor into @name, @age
         Exec TestProc @name, @age
         set @count = @count - 1
      end
   close FirstCursor 
   deallocate FirstCursor 
end

确保取消分配光标以避免错误。

我能够将eggheadcafe.com链接移植到我的代码。谢谢书呆子的文章做到了!此答案已被标记为删除,因为它是链接已断开的唯一链接答案。请您在不要求读者点击链接的情况下扩展答案以完全解决问题,好吗?您应该避免使用光标。有许多不草率的方法。甚至是下面的一个。我得到一个错误语法错误:“FROM”FROM在从Customer_光标获取下一个CustomerId、FirstName、LastName;时,在此位置处的输入无效;。你能帮帮我吗?当我用我的代码尝试这一点时,mytempIt中的21条记录从未执行过循环,这对我很有用。在选择@End=@@ROWCOUNT、@Current=0和@Currentcursors不正确之间,发布您对我的答案的修改,我将指出您的错误。在我使用光标之前,我宁愿把眼睛戳出来。你救了我一天。我的第一个存储过程:
(3 row(s) affected)
>>AAA,111
>>BBB,222
>>CCC,333
create procedure CursorProc
as
begin
   declare @count bigint;
   declare @age varchar(500)
   declare @name varchar(500)
   select @count = (select count(*) from employee)
   declare FirstCursor cursor for select name, age from employee
   open FirstCursor 
   while @count > 0
      begin
         fetch FirstCursor into @name, @age
         Exec TestProc @name, @age
         set @count = @count - 1
      end
   close FirstCursor 
   deallocate FirstCursor 
end