SQL Server循环 – 如何循环一组logging

我如何循环select一组logging?

所以说例如我有几条logging,我希望循环,并对每条logging做一些事情。 这是我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; 

这是我一直在做的,如果你需要做一些迭代…但是首先寻找set操作是明智的。

 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 

为了更好的可读性对萨姆的答案做了小改动:

 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 

如果你使用临时表是不错的话,那么另一种方法就是使用临时表。我已经亲自testing过了,它不会导致任何exception(即使临时表没有任何数据)。

 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 

这样我们可以迭代到表数据。

 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是用户定义的函数,它将parsing逗号分隔的数据并返回表。 谢谢

您可以select对数据进行排名,并添加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