Laten we zeggen dat ik de volgende eenvoudige tabelvariabele heb:
declare @databases table
(
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
Is het declareren en gebruiken van een cursor mijn enige optie als ik door de rijen wil itereren? Is er een andere manier?
Eerst en vooral moet je er absoluut zeker van zijn dat je elke rij moet itereren - set-gebaseerde operaties zullen sneller werken in elk geval dat ik kan bedenken en zullen normaal gezien eenvoudigere code gebruiken.
Afhankelijk van je gegevens kan het mogelijk zijn om te lussen door enkel gebruik te maken van select statements zoals hieronder getoond:
Declare @Id int
While (Select Count(*) From ATable Where Processed = 0) > 0
Begin
Select Top 1 @Id = Id From ATable Where Processed = 0
--Do some processing here
Update ATable Set Processed = 1 Where Id = @Id
End
Een ander alternatief is het gebruik van een tijdelijke tabel:
Select *
Into #Temp
From ATable
Declare @Id int
While (Select Count(*) From #Temp) > 0
Begin
Select Top 1 @Id = Id From #Temp
--Do some processing here
Delete #Temp Where Id = @Id
End
Welke optie u moet kiezen, hangt echt af van de structuur en het volume van uw gegevens.
Note: Als u SQL Server gebruikt, kunt u beter gebruik maken van:
WHILE EXISTS(SELECT * FROM #Temp)
Het gebruik van COUNT
zal elke rij in de tabel moeten aanraken, de EXISTS
hoeft alleen de eerste aan te raken (zie Josef's antwoord hieronder).
Hier is hoe ik het zou doen:
Select Identity(int, 1,1) AS PK, DatabaseID
Into #T
From @databases
Declare @maxPK int;Select @maxPK = MAX(PK) From #T
Declare @pk int;Set @pk = 1
While @pk <= @maxPK
Begin
-- Get one record
Select DatabaseID, Name, Server
From @databases
Where DatabaseID = (Select DatabaseID From #T Where PK = @pk)
--Do some processing here
--
Select @pk = @pk + 1
End
[Edit] Omdat ik waarschijnlijk het woord "variable" heb overgeslagen toen ik de vraag de eerste keer las, hier een bijgewerkt antwoord...
declare @databases table
(
PK int IDENTITY(1,1),
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
--/*
INSERT INTO @databases (DatabaseID, Name, Server) SELECT 1,'MainDB', 'MyServer'
INSERT INTO @databases (DatabaseID, Name, Server) SELECT 1,'MyDB', 'MyServer2'
--*/
Declare @maxPK int;Select @maxPK = MAX(PK) From @databases
Declare @pk int;Set @pk = 1
While @pk <= @maxPK
Begin
/* Get one record (you can read the values into some variables) */
Select DatabaseID, Name, Server
From @databases
Where PK = @pk
/* Do some processing here */
/* ... */
Select @pk = @pk + 1
End