Loop di SQL Server: come faccio a scorrere un set di record

come faccio a scorrere un set di record da una selezione?

Ad esempio, per esempio, ho alcuni record che desidero eseguire il ciclo e fare qualcosa con ogni record. Ecco una versione primitiva della mia selezione:

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

Grazie

Usando T-SQL e cursori come questo:

 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; 

Questo è quello che stavo facendo se hai bisogno di fare qualcosa di iterativo … ma sarebbe saggio cercare prima le operazioni 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 

Piccolo cambiamento nella risposta di sam yi (per una migliore leggibilità):

 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 

Solo un altro approccio se stai bene usando le tabelle temporali. L’ho testato personalmente e non causerà alcuna eccezione (anche se la tabella temporanea non ha dati).

 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 

Usando il cursore puoi facilmente scorrere i record individualmente e stampare i record separatamente o come un singolo messaggio, inclusi tutti i record.

 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 

Puoi scegliere di classificare i tuoi dati e aggiungere un ROW_NUMBER e contare fino a zero mentre iterate il set di dati.

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

in questo modo possiamo scorrere i dati della tabella.

 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 è la funzione di definizione dell'utente che analizzerà i dati separati da virgola e restituirà la tabella. Grazie