Ας πούμε ότι έχω την ακόλουθη απλή μεταβλητή πίνακα:
declare @databases table
(
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
Είναι η δήλωση και η χρήση ενός δρομέα η μόνη μου επιλογή αν ήθελα να κάνω επανάληψη στις γραμμές; Υπάρχει άλλος τρόπος;
Πρώτα απ' όλα θα πρέπει να είστε απολύτως βέβαιοι ότι πρέπει να επαναλαμβάνετε κάθε γραμμή - οι λειτουργίες που βασίζονται στο σύνολο θα αποδίδουν ταχύτερα σε κάθε περίπτωση που μπορώ να σκεφτώ και συνήθως θα χρησιμοποιούν απλούστερο κώδικα.
Ανάλογα με τα δεδομένα σας, μπορεί να είναι δυνατή η επανάληψη μόνο με τη χρήση δηλώσεων select, όπως φαίνεται παρακάτω:
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
Μια άλλη εναλλακτική λύση είναι η χρήση ενός προσωρινού πίνακα:
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
Η επιλογή που πρέπει να επιλέξετε εξαρτάται πραγματικά από τη δομή και τον όγκο των δεδομένων σας.
Σημείωση: Εάν χρησιμοποιείτε SQL Server, θα ήταν καλύτερο να χρησιμοποιήσετε τη λύση:
WHILE EXISTS(SELECT * FROM #Temp)
Η χρήση του COUNT
θα πρέπει να αγγίξει κάθε γραμμή του πίνακα, ενώ το EXISTS
χρειάζεται να αγγίξει μόνο την πρώτη (δείτε την Josef's answer παρακάτω).
Ακούστε πώς θα το έκανα:
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
[Επεξεργασία] Επειδή μάλλον παρέλειψα τη λέξη "μεταβλητή" όταν διάβασα για πρώτη φορά την ερώτηση, εδώ είναι μια ενημερωμένη απάντηση...
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
Μπορείτε να χρησιμοποιήσετε έναν βρόχο while:
While (Select Count(*) From #TempTable) > 0
Begin
Insert Into @Databases...
Delete From #TempTable Where x = x
End