Avatar billede screwdriver Nybegynder
11. maj 2011 - 21:45 Der er 6 kommentarer og
1 løsning

Udfyld et resultset i en Stored procedure

Hej

Jeg har en tabel, som indeholder informationer om fly afgange.
Den er defineret således:
Create Table Departures (
    FlightNo int not null IDENTITY(1000, 1) Primary key
    , WeekdayNo int not null
    , StartDate Date null
    , StopDate Date null
    );
Jeg ønsker at lave en SP som kaldes med FlightNo, og retunerer et resultset med alle de datoer, som ligger mellem StartDate og StopDate

I C# ville det være:
DateTime MyDate = StartDate;
do {
  ResultSet.Add(MyDate);
  MyDate.Adddays(7);
}
while (MyDate<=StopDate);
return ResultSet ;

Kan man lave det i en SP?
Avatar billede HenrikSjang Nybegynder
11. maj 2011 - 21:59 #1
Måske er jeg tungnem, men jeg forstår ikke helt hvad det er du er ude efter. Du ønsker et resultset, med alle datoer mellem start og stop. Mener du de rækker, hvor dags dato ligger mellem StartDate og StopDate?

Hvis ja, så er det bare dette du er ude efter:

select * from Departures
where getdate() between StartDate and StopDate

Det c# kode du skriver, synes jeg heller ikke helt jeg kan gennemskue. Der ser det ud til, at resultset'et ikke skal indeholde data fra din tabel, men i stedet blot dato'er.

Kan du måske prøve at forklare lidt bedre, evt. med et eksempel på hvad data du har i din tabel, og hvad du forventer at skulle have returneret.
Avatar billede ulrikm Nybegynder
11. maj 2011 - 22:05 #2
du kan evt bruge en tabelvariabel, loope og indsætte og til sidst returnere indholdet:

create proc myproc( @fligthno int )
as
begin

  select @startdate = startdate, @stopdate = stopdate
  from Departures where FlightNo = @flightno

  declare @res table( seqno int identity(1,1), date datetime )

  declare @date datetime
  set @date = @startdate

  insert into @res values( @date )

  while @startdate <= @stopdate
  begin
    insert into @res values( @date )
    set @date = dateadd(dd,1,@date)
  end


  select date from @res order by seqno

end
Avatar billede HenrikSjang Nybegynder
11. maj 2011 - 22:16 #3
Hehe, jeg havde lige overset at man skal fodre sp'en med et flightno, og så er det jo nok fair nok at antage at der kun er én record i tabellen der passer på det givne flightno. Og så er dit forslag vist meget fint.
Avatar billede screwdriver Nybegynder
11. maj 2011 - 22:38 #4
Hej ulrikm

Jeg tror du er inde på det rigtige, men jeg får
Must declare the scalar variable "@startdate".
Når jeg forsøger.

Har forsøgt at ændre starten til:
create Procedure myproc
    @flightno int,
    @startDate datetime = O output,
    @stopdate datetime = O output
as
begin...
Så kan jeg create proceduren, men får:
Conversion failed when converting date and/or time from character string.
når jeg kalder den ( execute myproc 1012)

Sjang: Jeg forventer at få En kollonne "Dato", og X antal rækker med datoer, med 7 dage imellem, for alle datoer som ligger mellem startdate og stopdate
Avatar billede ulrikm Nybegynder
11. maj 2011 - 23:36 #5
Hov, det gik lidt hurtigt - declare @startdate, @stopdate, Date data type, "while @startdate" og 7 dage imellem.. Denne burde være bedre:

create proc myproc( @flightno int )
as
begin

  declare @startdate date, @stopdate date
  select @startdate = startdate, @stopdate = stopdate
  from Departures where FlightNo = @flightno

  declare @res table( seqno int identity(1,1), date date )

  declare @date date
  set @date = @startdate

  insert into @res values( @date )

  while @date <= @stopdate
  begin

    insert into @res values( @date )
    set @date = dateadd(dd,7,@date)
  end

  select date from @res order by seqno

end
Avatar billede screwdriver Nybegynder
14. maj 2011 - 10:23 #6
Hej ulrikm

Det virker super, men jeg har lige lidt opklarende spørgsmål...

Jeg har lige ændret lidt i det (1 dato kom 2 gange), og så har jeg fjernet seqno. Har seqno nogen betydning mht. preformance?

"declare @res table" creater det en temp table i databasen, eller kun i hukommelsen?
Smid lige et svar

Min kode ser nu således ud ...

create proc myproc( @flightno int )
as
begin

  declare @startdate date, @stopdate date
  select @startdate = startdate, @stopdate = stopdate
  from Departures where FlightNo = @flightno

  declare @res table( [Departure date] date Primary key)

  declare @MyDate date
  set @MyDate = @startdate

  while @MyDate <= @stopdate
  begin
    insert into @res values( @MyDate )
    set @MyDate = dateadd(dd,7,@MyDate)
  end

  select [Departure date] from @res order by [Departure date]

end
Avatar billede ulrikm Nybegynder
14. maj 2011 - 11:05 #7
seqno skulle bare sørge for at de kom ud i den rigtige rækkefølge - men det kan du jo også gøre ved at sortere på dato - seqno er vist bare min vane. Når der skal sorteres så få elementer, har det ingen praktisk betydning om der sorteres på int eller date, men min fornemmelse er at int er generelt hurtigere (uden at jeg overhovedet har undersøgt det).

Tabelvariabler lægger data i memory - men man kan også indstille sql server til at have almindelige temp tabeller i memory.
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