Tarkime, turiu tokį paprastą lentelės kintamąjį:
declare @databases table
(
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
Ar kursyvo deklaravimas ir naudojimas yra vienintelė galimybė, jei norėčiau iteruoti eilutes? Ar yra kitas būdas?
Pirmiausia turėtumėte būti visiškai tikri, kad jums reikia iteruoti per kiekvieną eilutę - rinkiniu pagrįstos operacijos bus atliekamos greičiau visais man žinomais atvejais ir paprastai bus naudojamas paprastesnis kodas.
Priklausomai nuo jūsų duomenų, gali būti įmanoma sudaryti ciklą tik naudojant select teiginius, kaip parodyta toliau:
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
Kita alternatyva - naudoti laikiną lentelę:
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
Kurią galimybę pasirinkti, iš tikrųjų priklauso nuo jūsų duomenų struktūros ir apimties.
Pastaba: Jei naudojate "SQL Server", geriau būtų naudoti:
WHILE EXISTS(SELECT * FROM #Temp)
Naudojant COUNT
reikės paliesti kiekvieną lentelės eilutę, o naudojant EXISTS
- tik pirmąją (žr. Josef's atsakymą žemiau).
Štai kaip aš tai daryčiau:
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
[Redaguoti] Kadangi aš tikriausiai praleido žodį "kintamasis", kai aš pirmą kartą perskaičiau klausimą, čia yra atnaujintas atsakymas...
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