Avatar billede thrakrath Nybegynder
01. maj 2001 - 10:03 Der er 11 kommentarer og
1 løsning

Do while...

Hej

Når man har en SQL-streng i en asp kode, kan man bare skrive:
  do while not streng.eof
      content........
  streng.movenext
  loop

Også får man listet x antal recordset. Men hvordan gør man ovenstående i en stored procedure alene. Dvs laver et loop i en stored procedure ud fra en select statement.

På forhånd tak.

Jeg giver 300 point for spørgsmålet, fordi at det er rimeligt vigtigt at jeg får et svar.
Avatar billede slash Nybegynder
01. maj 2001 - 10:09 #1
du kan gøre noget á la dette:

declare @next_id int
declare @medlemsnr int
select @next_id = 0

while @next_id is not null
begin
  select @next_id = min([myid]) from T_2000
    where [myid] > @next_id

    if @next_id is not null
    begin
        select @medlemsnr = medlemsnr from T_2000 where tr_id = @next_id
        print \'transreg:    \'+convert(varchar(10),@medlemsnrtransreg)
    end

end
Avatar billede thrakrath Nybegynder
01. maj 2001 - 10:21 #2
Øhhh ja.... Såvidt jeg kan se, så finder du den record hvor [myid] er større end @next_id.

Men det holder ikke hvis ens id\'ere(myid) ligger i forskellige rækkefølge i tabellen flere forskellige størrelser. f.eks.:

myid
--------
2
3
6
4
7
9
8

Har jeg ret i det?
Avatar billede thrakrath Nybegynder
01. maj 2001 - 10:28 #3
Hør det er da vist noget sludder jeg skrev lige før..... jeg tester sku lige skidtet og ser ad....
øjeblik.
Avatar billede thrakrath Nybegynder
01. maj 2001 - 10:31 #4
Nej det var ikke noget sludder.... jeg skulle vist have blevet i min seng i dag.
Avatar billede thrakrath Nybegynder
01. maj 2001 - 10:33 #5
Jeg indsætter lige min kode:

CREATE PROCEDURE sysSendNotification AS
    Declare @object int,
                        @hr int,
                @BrugerID int,
                @SkadeanmeldelseNummer int,
                          @Brugernavn Varchar(255),
                          @Email Varchar(255)
   
    Select @BrugerID = 0

    Select @BrugerID = SA.BrugerID, @SkadeanmeldelseNummer = SA.SkadeanmeldelseNummer From
      tblSkadeanmeldelse SA Left outer join tblBruger BR on SA.BrugerID = BR.BrugerID Where
    datediff(d, getdate(), SA.MailNotifikation) = 0 And
    SA.SkadeanmeldelseStatus = \'Igangvaerende\' And
      SA.SkadeType  = 1 And
    SA.BrugerID > @BrugerID

    Select  @Brugernavn = Navn, @Email = Email  From tblBruger Where BrugerID = @BrugerID

    Exec @hr = sp_OACreate \'CDONTS.Newmail\', @object Out
      If @hr <> 0 Begin
                    Print \"FEJL : Kunne ikke starte CDONTS\"
                    Return
      End

      Exec @hr = sp_OASetProperty @object, \'BodyFormat\', 0
      Exec @hr = sp_OASetProperty @object, \'MailFormat\', 0
      Exec @hr = sp_OASetProperty @object, \'body\', \'Notifikation omkring skadeanmeldelsenummer:\'
      Exec @hr = sp_OASetProperty @object, \'body\', @SkadeanmeldelseNummer
      Exec @hr = sp_OASetProperty @object, \'From\', \'Rådet For Større Færdselsikkerhed\'
      Exec @hr = sp_OASetProperty @object, \'To\', \'james.gosling@cellnetwork.com\'
      Exec @hr = sp_OASetProperty @object, \'Subject\', \'Notifikation\'
      Exec @hr = sp_OAMethod @object, \'send\',NULL
      If @hr <> 0 Begin
                    print \'FEJL : Kunne ikke sende mail.\'
                    Return
      End

      Exec @hr = sp_OADestroy @object
      if @hr <> 0 Begin
                    print \'FEJL : Kunne ikke destruere CDONTS.\'
                    Return
      End

    --Debugging
    print @Email
    print @SkadeanmeldelseNummer
    print @hr
GO
Avatar billede slash Nybegynder
01. maj 2001 - 10:39 #6
men, du kunne måske lige fortælle hvor der står noget om at instansiere objekter i sql-server... i sql BOL???
Avatar billede slash Nybegynder
01. maj 2001 - 10:58 #7
du kunne vel ikke være så venlig at forklare hvad du vil? Sende en mail til én person eller flere personer med en given skadeanmed.?
Avatar billede mwittrock Nybegynder
01. maj 2001 - 16:46 #8
thrakrath,

det lyder som om du har brug for en cursor? Prøv det følgende i Query Analyzer:

-----------8<-----------

USE pubs

GO

DECLARE c_Titles CURSOR FOR
SELECT Title
FROM  Titles

DECLARE @currTitle VARCHAR(80)

OPEN c_Titles

FETCH NEXT FROM c_Titles INTO @currTitle

WHILE (@@FETCH_STATUS = 0)
  BEGIN
  -- Så længe @@FETCH_STATUS er lig 0, lykkedes det at hente næste række fra cursoren
  PRINT @currTitle
  FETCH NEXT FROM c_Titles INTO @currTitle
  END

CLOSE c_Titles
DEALLOCATE c_Titles

-----------8<-----------

Når du åbner et RecordSet i ADO, åbner du fra databasens synspunkt en cursor.
Avatar billede thrakrath Nybegynder
02. maj 2001 - 15:24 #9
Det har du fuldstændig ret i...... Mange tak.
Avatar billede smurfen Nybegynder
02. maj 2001 - 15:40 #10
bare lige en reminder. sql skal ikke bruges til at lave loops. det er fjollet.
Avatar billede mwittrock Nybegynder
02. maj 2001 - 16:06 #11
Nu kan man jo heller ikke lave loops i SQL. Man kan lave loops i Transact-SQL :-) T-SQL er jo netop en procedural udvidelse af SQL, på linie med Oracles PL/SQL og tilsvarende. Sprogets eneste eksistensberettigelse er at lave simple forgreninger, løkker osv.
Avatar billede cynosure Nybegynder
19. december 2002 - 11:11 #12
mwittrock  : Kanon svar du har fået point for.. Noget guf jeg kunne bruge.. Tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester