SQL Server loop - how do I loop through a set of records

前端 未结 8 1458
慢半拍i
慢半拍i 2020-11-28 17:54

how do I loop through a set of records from a select?

So say for example I have a few records that I wish to loop through and do something with each record. Here\'s

相关标签:
8条回答
  • 2020-11-28 18:15

    I think this is the easy way example to iterate item.

    declare @cateid int
    select CateID into [#TempTable] from Category where GroupID = 'STOCKLIST'
    
    while (select count(*) from #TempTable) > 0
    begin
        select top 1 @cateid = CateID from #TempTable
        print(@cateid)
    
        --DO SOMETHING HERE
    
        delete #TempTable where CateID = @cateid
    end
    
    drop table #TempTable
    
    0 讨论(0)
  • 2020-11-28 18:20

    By using T-SQL and cursors like this :

    DECLARE @MyCursor CURSOR;
    DECLARE @MyField YourFieldDataType;
    BEGIN
        SET @MyCursor = CURSOR FOR
        select top 1000 YourField from dbo.table
            where StatusID = 7      
    
        OPEN @MyCursor 
        FETCH NEXT FROM @MyCursor 
        INTO @MyField
    
        WHILE @@FETCH_STATUS = 0
        BEGIN
          /*
             YOUR ALGORITHM GOES HERE   
          */
          FETCH NEXT FROM @MyCursor 
          INTO @MyField 
        END; 
    
        CLOSE @MyCursor ;
        DEALLOCATE @MyCursor;
    END;
    
    0 讨论(0)
  • 2020-11-28 18:20

    Small change to sam yi's answer (for better readability):

    select top 1000 TableID
    into #ControlTable 
    from dbo.table
    where StatusID = 7
    
    declare @TableID int
    
    while exists (select * from #ControlTable)
    begin
    
        select @TableID = (select top 1 TableID
                           from #ControlTable
                           order by TableID asc)
    
        -- Do something with your TableID
    
        delete #ControlTable
        where TableID = @TableID
    
    end
    
    drop table #ControlTable
    
    0 讨论(0)
  • 2020-11-28 18:27

    This is what I've been doing if you need to do something iterative... but it would be wise to look for set operations first. Also, do not do this because you don't want to learn cursors.

    select top 1000 TableID
    into #ControlTable 
    from dbo.table
    where StatusID = 7
    
    declare @TableID int
    
    while exists (select * from #ControlTable)
    begin
    
        select top 1 @TableID = TableID
        from #ControlTable
        order by TableID asc
    
        -- Do something with your TableID
    
        delete #ControlTable
        where TableID = @TableID
    
    end
    
    drop table #ControlTable
    
    0 讨论(0)
  • 2020-11-28 18:30

    By using cursor you can easily iterate through records individually and print records separately or as a single message including all the records.

    DECLARE @CustomerID as INT;
    declare @msg varchar(max)
    DECLARE @BusinessCursor as CURSOR;
    
    SET @BusinessCursor = CURSOR FOR
    SELECT CustomerID FROM Customer WHERE CustomerID IN ('3908745','3911122','3911128','3911421')
    
    OPEN @BusinessCursor;
        FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
        WHILE @@FETCH_STATUS = 0
            BEGIN
                SET @msg = '{
                  "CustomerID": "'+CONVERT(varchar(10), @CustomerID)+'",
                  "Customer": {
                    "LastName": "LastName-'+CONVERT(varchar(10), @CustomerID) +'",
                    "FirstName": "FirstName-'+CONVERT(varchar(10), @CustomerID)+'",    
                  }
                }|'
            print @msg
        FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
    END
    
    0 讨论(0)
  • 2020-11-28 18:36

    You could choose to rank your data and add a ROW_NUMBER and count down to zero while iterate your dataset.

    -- Get your dataset and rank your dataset by adding a new row_number
    SELECT  TOP 1000 A.*, ROW_NUMBER() OVER(ORDER BY A.ID DESC) AS ROW
    INTO #TEMPTABLE 
    FROM DBO.TABLE AS A
    WHERE STATUSID = 7;
    
    --Find the highest number to start with
    DECLARE @COUNTER INT = (SELECT MAX(ROW) FROM #TEMPTABLE);
    DECLARE @ROW INT;
    
    -- Loop true your data until you hit 0
    WHILE (@COUNTER != 0)
    BEGIN
    
        SELECT @ROW = ROW
        FROM #TEMPTABLE
        WHERE ROW = @COUNTER
        ORDER BY ROW DESC
    
        --DO SOMTHING COOL  
    
        -- SET your counter to -1
        SET @COUNTER = @ROW -1
    END
    
    DROP TABLE #TEMPTABLE
    
    0 讨论(0)
提交回复
热议问题