복붙노트

[SQL] SQL 서버 루프 - 레코드 집합을 통해 내가 루프를 어떻게

SQL

SQL 서버 루프 - 레코드 집합을 통해 내가 루프를 어떻게

어떻게 선택에서 레코드 집합을 통해 루프를합니까?

그래서 예를 들어 내가 통해 루프 할 각 레코드와 함께 뭔가를 할 것이 몇 가지 기록이 말한다. 여기 내 선택의 원시적 버전입니다 :

select top 1000 * from dbo.table
where StatusID = 7 

감사

해결법

  1. ==============================

    1.이 같은 T-SQL과 커서를 사용하여 :

    이 같은 T-SQL과 커서를 사용하여 :

    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;
    
  2. ==============================

    2.이것은 당신이 뭔가를 반복 할 필요가 만약 내가 해왔습니다 ...하지만 그것은 현명한 최초의 설정 작업에보고 될 것입니다.

    이것은 당신이 뭔가를 반복 할 필요가 만약 내가 해왔습니다 ...하지만 그것은 현명한 최초의 설정 작업에보고 될 것입니다.

    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
    
  3. ==============================

    3.(가독성을위한) 샘 이순신의 대답에 작은 변화 :

    (가독성을위한) 샘 이순신의 대답에 작은 변화 :

    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
    
  4. ==============================

    4.할 수 있습니다 커서를 사용하여 쉽게 반복 처리 개별적으로 기록을 통해 별도로 기록을 인쇄하거나 모든 레코드를 포함하는 하나의 메시지로.

    할 수 있습니다 커서를 사용하여 쉽게 반복 처리 개별적으로 기록을 통해 별도로 기록을 인쇄하거나 모든 레코드를 포함하는 하나의 메시지로.

    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
    
  5. ==============================

    5.당신이 잘 임시 tables.I를 사용하는 경우 그냥 다른 접근 방식은 개인적으로이 테스트 한 (임시 테이블에 데이터가없는 경우에도 마찬가지입니다.)되지 않습니다 예외 원인

    당신이 잘 임시 tables.I를 사용하는 경우 그냥 다른 접근 방식은 개인적으로이 테스트 한 (임시 테이블에 데이터가없는 경우에도 마찬가지입니다.)되지 않습니다 예외 원인

    CREATE TABLE #TempTable
    (
        ROWID int identity(1,1) primary key,
        HIERARCHY_ID_TO_UPDATE int,
    )
    
    --create some testing data
    --INSERT INTO #TempTable VALUES(1)
    --INSERT INTO #TempTable VALUES(2)
    --INSERT INTO #TempTable VALUES(4)
    --INSERT INTO #TempTable VALUES(6)
    --INSERT INTO #TempTable VALUES(8)
    
    DECLARE @MAXID INT, @Counter INT
    
    SET @COUNTER = 1
    SELECT @MAXID = COUNT(*) FROM #TempTable
    
    WHILE (@COUNTER <= @MAXID)
    BEGIN
        --DO THE PROCESSING HERE 
        SELECT @HIERARCHY_ID_TO_UPDATE = PT.HIERARCHY_ID_TO_UPDATE
        FROM #TempTable AS PT
        WHERE ROWID = @COUNTER
    
        SET @COUNTER = @COUNTER + 1
    END
    
    
    IF (OBJECT_ID('tempdb..#TempTable') IS NOT NULL)
    BEGIN
        DROP TABLE #TempTable
    END
    
  6. ==============================

    6.당신은 당신의 데이터를 평가하고, ROW_NUMBER를 추가하고 반복 처리하는 동안 데이터 집합 제로로 카운트 다운을 선택할 수 있습니다.

    당신은 당신의 데이터를 평가하고, ROW_NUMBER를 추가하고 반복 처리하는 동안 데이터 집합 제로로 카운트 다운을 선택할 수 있습니다.

    -- 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
    
  7. ==============================

    7.우리는 테이블 데이터로 반복 할 수 이런 식으로.

    우리는 테이블 데이터로 반복 할 수 이런 식으로.

    DECLARE @_MinJobID INT
    DECLARE @_MaxJobID INT
    CREATE  TABLE #Temp (JobID INT)
    
    INSERT INTO #Temp SELECT * FROM DBO.STRINGTOTABLE(@JobID,',')
    SELECT @_MinJID = MIN(JobID),@_MaxJID = MAX(JobID)  FROM #Temp
    
        WHILE @_MinJID <= @_MaxJID
        BEGIN
    
            INSERT INTO Mytable        
            (        
                JobID,        
            )        
    
            VALUES        
            (        
                @_MinJobID,        
            ) 
    
            SET @_MinJID = @_MinJID + 1;
        END
    
    DROP TABLE #Temp
    

    STRINGTOTABLE 사용자가 콤마 분리 된 데이터 및 반송 테이블을 해석하는 기능을 정의한다. 감사

  8. ==============================

    8.나는 이것이 반복 처리 항목에 쉬운 방법의 예라고 생각합니다.

    나는 이것이 반복 처리 항목에 쉬운 방법의 예라고 생각합니다.

    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
    
  9. from https://stackoverflow.com/questions/20662356/sql-server-loop-how-do-i-loop-through-a-set-of-records by cc-by-sa and MIT license