반응형
SQL Server 레코드 세트를 루프하려면 어떻게 해야 합니까?
select 스테이트먼트에서 레코드 세트를 루프하려면 어떻게 해야 합니까?
예를 들어, 각 레코드에 대해 루프스루하고 싶은 레코드가 몇 개 있다고 합시다.다음은 제가 선택한 진술의 기본 버전입니다.
select top 1000 * from dbo.table
where StatusID = 7
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;
이게 내가 해왔던 일이야. 만약 네가 반복적인 일을 해야 할 필요가 있다면...하지만 먼저 설정 작업을 찾는 것이 현명할 것입니다.또한 커서를 학습하지 않으려는 경우에는 이 작업을 수행하지 마십시오.
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
samyi의 답변에 약간의 변경(가독성 향상):
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
커서를 사용하면 레코드를 개별적으로 쉽게 반복하고 레코드를 개별적으로 인쇄하거나 모든 레코드를 포함한 단일 메시지로 인쇄할 수 있습니다.
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
임시 테이블을 사용해도 괜찮다면 다른 접근법일 뿐입니다.직접 테스트해 본 결과, 예외는 발생하지 않습니다(temp 테이블에 데이터가 없는 경우에도).
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
데이터 세트를 반복하는 동안 데이터 순위를 지정하고 ROW_NUMBER를 추가한 후 0까지 카운트다운하도록 선택할 수 있습니다.
-- 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
이 방법으로 테이블 데이터로 반복할 수 있습니다.
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은 쉼표로 구분된 데이터와 테이블을 해석하는 사용자 정의 함수입니다.감사해요.
이것은 반복하기 쉬운 예라고 생각합니다.
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
언급URL : https://stackoverflow.com/questions/20662356/how-do-i-loop-through-a-set-of-records-in-sql-server
반응형
'programing' 카테고리의 다른 글
CTE와 SubQuery의 차이점 (0) | 2023.04.07 |
---|---|
SQL Server에서 JOIN을 사용하여 테이블을 업데이트하시겠습니까? (0) | 2023.04.07 |
Visual Studio:콘텍스트 스위치 데드록 (0) | 2023.04.07 |
sql 서버에서 더블을 나타내는 것은 무엇입니까? (0) | 2023.04.07 |
SQL Server의 SYSNAME 데이터 유형은 무엇입니까? (0) | 2023.04.07 |