Hvordan å gå gjennom et resultatsett ved hjelp av Transact-SQL i SQL Server


Sammendrag


Denne artikkelen beskriver forskjellige metoder du kan bruke til å simulere en markør som FETCH neste logikken i en lagret prosedyre, utløser eller Transact-SQL-bulken.


Bruke Transact-SQL-setninger til å gå gjennom et resultatsett

Det finnes tre metoder du kan bruke til å gå gjennom et resultatsett ved hjelp av Transact-SQL-setninger.


Én metode er bruken av temp tabeller. Med denne metoden oppretter et "øyeblikksbilde" av den første SELECT-setningen og bruker den som grunnlag for "peking." For eksempel:

/********** example 1 **********/ 

declare @au_id char( 11 )

set rowcount 0
select * into #mytemp from authors

set rowcount 1

select @au_id = au_id from #mytemp

while @@rowcount <> 0
begin
set rowcount 0
select * from #mytemp where au_id = @au_id
delete #mytemp where au_id = @au_id

set rowcount 1
select @au_id = au_id from #mytemp<BR/>
end
set rowcount 0

En annen metode er å bruke min -funksjonen til å "gå" en tabellrad én om gangen. Denne metoden fanger opp nye rader som ble lagt til etter at den lagrede prosedyren begynner å kjøre, forutsatt at den nye raden har en unik identifikator som er større enn den gjeldende raden som behandles i spørringen. For eksempel:

/********** example 2 **********/ 

declare @au_id char( 11 )

select @au_id = min( au_id ) from authors

while @au_id is not null
begin
select * from authors where au_id = @au_id
select @au_id = min( au_id ) from authors where au_id > @au_id
end
Merk: begge eksempel 1 og 2 anta at det finnes en entydig identifikator for hver rad i kildetabellen. I noen tilfeller kan det finnes ingen unik identifikator. Hvis det er tilfelle, kan du endre metoden temp -tabellen hvis du vil bruke en nylig opprettet nøkkelkolonne. For eksempel:

/********** example 3 **********/ 

set rowcount 0
select NULL mykey, * into #mytemp from authors

set rowcount 1
update #mytemp set mykey = 1

while @@rowcount > 0
begin
set rowcount 0
select * from #mytemp where mykey = 1
delete #mytemp where mykey = 1
set rowcount 1
update #mytemp set mykey = 1
end
set rowcount 0