How can I iterate over a recordset within a stored procedure?

后端 未结 3 650
醉梦人生
醉梦人生 2021-02-02 12:33

I need to iterate over a recordset from a stored procedure and execute another stored procedure using each fields as arguments. I can\'t complete this iteration in the code. I h

相关标签:
3条回答
  • 2021-02-02 12:57

    You need to create a cursor to loop through the record set.

    Example Table:

    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')
    

    Cursor:

    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
    

    Here is a link to MSDN on how to create them.

    http://msdn.microsoft.com/en-us/library/ms180169.aspx

    This is why I used Raise Error instead of PRINT for output.
    http://structuredsight.com/2014/11/24/wait-wait-dont-tell-me-on-second-thought/

    0 讨论(0)
  • 2021-02-02 13:02

    Well its very easy to loop through the rows in sql procedure u just need to use cursor, i am giving you an example here, for it let us consider a table Employee with column NAME and AGE with 50 records into it and u have to execute a stored procedure say TESTPROC which will take name and age parameters of each row.

    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
    

    Make sure you deallocate the cursor to avoid errors.

    0 讨论(0)
  • 2021-02-02 13:11

    try this (cursor free looping):

    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
    

    working example:

    CREATE PROCEDURE nameofstoredprocedure_1
    (@arg1 int, @arg2 int, @arg3 int)
    AS
    SELECT 'AAA',@arg1 UNION SELECT 'BBB',@arg2 UNION SELECT 'CCC',@arg3
    GO
    
    CREATE PROCEDURE nameofstoredprocedure_2
    (@P1 varchar(5), @P2 int)
    AS
    PRINT '>>'+ISNULL(@P1,'')+','+ISNULL(CONVERT(varchar(10),@P2),'')
    GO
    
    CREATE TABLE #Results  (RowID  int identity(1,1), Col1  varchar(5), Col2 int)
    DECLARE @Current  int
           ,@End      int
    DECLARE @Col1  varchar(5)
           ,@Col2 int
    
    
    INSERT INTO #Results
        (Col1, COl2)
        EXEC nameofstoredprocedure_1 111, 222, 333
    SELECT @End=@@ROWCOUNT,@Current=0
    
    WHILE @Current<@End
    BEGIN
        SET @Current=@Current+1
    
        SELECT
            @Col1=COl1, @Col2=Col2
            FROM #Results
            WHERE RowID=@Current
    
        EXEC nameofstoredprocedure_2  @Col1, @Col2
    
    END
    

    OUTPUT:

    (3 row(s) affected)
    >>AAA,111
    >>BBB,222
    >>CCC,333
    
    0 讨论(0)
提交回复
热议问题