[SQL] SQL 서버 루프 - 레코드 집합을 통해 내가 루프를 어떻게
SQLSQL 서버 루프 - 레코드 집합을 통해 내가 루프를 어떻게
어떻게 선택에서 레코드 집합을 통해 루프를합니까?
그래서 예를 들어 내가 통해 루프 할 각 레코드와 함께 뭔가를 할 것이 몇 가지 기록이 말한다. 여기 내 선택의 원시적 버전입니다 :
select top 1000 * from dbo.table
where StatusID = 7
감사
해결법
-
==============================
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.이것은 당신이 뭔가를 반복 할 필요가 만약 내가 해왔습니다 ...하지만 그것은 현명한 최초의 설정 작업에보고 될 것입니다.
이것은 당신이 뭔가를 반복 할 필요가 만약 내가 해왔습니다 ...하지만 그것은 현명한 최초의 설정 작업에보고 될 것입니다.
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.(가독성을위한) 샘 이순신의 대답에 작은 변화 :
(가독성을위한) 샘 이순신의 대답에 작은 변화 :
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.할 수 있습니다 커서를 사용하여 쉽게 반복 처리 개별적으로 기록을 통해 별도로 기록을 인쇄하거나 모든 레코드를 포함하는 하나의 메시지로.
할 수 있습니다 커서를 사용하여 쉽게 반복 처리 개별적으로 기록을 통해 별도로 기록을 인쇄하거나 모든 레코드를 포함하는 하나의 메시지로.
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.당신이 잘 임시 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.당신은 당신의 데이터를 평가하고, 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.우리는 테이블 데이터로 반복 할 수 이런 식으로.
우리는 테이블 데이터로 반복 할 수 이런 식으로.
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.나는 이것이 반복 처리 항목에 쉬운 방법의 예라고 생각합니다.
나는 이것이 반복 처리 항목에 쉬운 방법의 예라고 생각합니다.
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
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
'SQL' 카테고리의 다른 글
[SQL] ID를 다른 테이블에서 일치하지 않는 삭제 SQL 행 (0) | 2020.05.06 |
---|---|
[SQL] 그룹으로의 실행 순서 무엇 갖는 및 Where 절 SQL 서버에? (0) | 2020.05.06 |
[SQL] MySQL은 어떻게 행을 복사하지만 몇 가지 필드를 변경하려면? (0) | 2020.05.06 |
[SQL] SQL Server의 중첩 된 경우 문 로직을 수행하는 가장 좋은 방법은 (0) | 2020.05.06 |
[SQL] 어떻게 MySQL은 현재 날짜 및 시간을 얻으려면? (0) | 2020.05.06 |