Avatar billede peterlang Nybegynder
15. november 2002 - 19:52 Der er 13 kommentarer og
1 løsning

Find alle fra tabel + tilfør et idnr.

Jeg har et problem, jeg skal i en Stored Procedure finde alle fra en tabel (den har kun en felt, NAVN).
Jeg vil i mit output have 2 felter, NAVN og NR (nr skal køre fra 1 til antal fundet)


SELECT navn, nr+1 as 'nr' FROM navn WHERE navn like 'b%'

Dette skal ske uden brug af "Temporary Table", og i SP'en

Håber i har en ide.


Peter Lang
Avatar billede arne_v Ekspert
15. november 2002 - 20:28 #1
Prøv noget i retning af:

CREATE PROCEDURE PeterSP AS

DECLARE @nr INTEGER, @navn VARCHAR(50)

SELECT @nr = 1

DECLARE c CURSOR FOR
SELECT navn FROM PeterTabel

OPEN c

FETCH NEXT FROM c INTO @navn

WHILE @@FETCH_STATUS = 0
BEGIN
      SELECT @nr = @nr + 1
      PRINT CAST(@nr AS VARCHAR(8)) + " " + @navn
      FETCH NEXT FROM c INTO @navn
END

CLOSE c

DEALLOCATE c
Avatar billede arne_v Ekspert
15. november 2002 - 20:30 #2
Jeg glemte iøvrigt WHERE betingelse, men den regner
jeg med du selv kan putte på.
Avatar billede peterlang Nybegynder
15. november 2002 - 20:51 #3
Tak for svaret, det ser spændende ud.

Jeg har aldrig arbejde med CURSOR i Stored Procedure, tager det meget kraft/energi fra serveren?


Peter Lang
Avatar billede arne_v Ekspert
15. november 2002 - 20:53 #4
Ved jeg ikke.
Avatar billede peterlang Nybegynder
15. november 2002 - 20:58 #5
Ok, du for pointene

Men jeg lader den lige stå lidt, hvis andre har nogle kommentar.

Tak for hjælpen
Avatar billede ocp Nybegynder
15. november 2002 - 23:14 #6
Hvis det KAN undgås anbefales det klart at undgå en cursor. Prøv nedenstående i stedet - det benytter en temporær tabel

Create Table #tbl (
  nr int  identity(1,1),
  navn varchar(500)
)

insert into #tbl SELECT navn FROM PeterTabel

select * from #tbl
Drop Table #tbl

>arne_v: For at optimere den cursor du benytter skal den erkælres således:

  declare c cursor fast_forward FOR
  SELECT navn FROM PeterTabel

Fast_Forward bruger færre ressourcer og er i det hele taget hurtigere - men kan kun køre "forlæns".
Avatar billede peterlang Nybegynder
15. november 2002 - 23:37 #7
Tak for din kommentar,
Det jeg er ved at lave er en paging funktion i en SP
men kunne man ikke lave den i en "Derived Table" (tabel der er i hukomelsen) i stedet for "Temporary Table" skulle være hurtigere.
Det er derfor jeg skal bruge et ID nr.

SELECT * FROM (SELECT navn, >>nr+1<< FROM navn WHERE navn like 'b%') temp WHERE nr>@Start and nr<@Slut

Men hvordan for jeg nr til at blive 1 højre for hver row


Peter Lang
Avatar billede ocp Nybegynder
16. november 2002 - 00:31 #8
Det gør identity-automatisk.
Avatar billede ocp Nybegynder
16. november 2002 - 00:36 #9
Jeg har netop lavet sådan en funktion til præsentation af søgeresultater. Den eneste sikre måde er at opbygge en ny tabel (som jeg gør) for hver gang du skal vise en ny side. Dit where-statement klarer visningen af resultater for den rigtige side.
Hvis du vil "spare" skal du kun gemme ID'er i den temporære tabel og så efterfølgende lave et select (med dit where-statement) som indeholder de felter du skal bruge, join'et med de nødvendige tabeller.
Avatar billede peterlang Nybegynder
16. november 2002 - 01:55 #10
jeg har søgt en del på nettet, og det ser ud til du har ret.
Jeg laver det i en tmp tabel som du foreslår..

Jeg skal lige høre hvor i SP skal det med cursor'en ind.
Og hvordan får du fat i total hit (har du lavet 2 x select)

Peter Lang
Avatar billede bennytordrup Nybegynder
16. november 2002 - 12:43 #11
Hvis det kan have interesse, så findes der i Microsofts Knowledgebase en metode, der ikke inkluderer en temp table, men et direkte SQL. Jeg kan finde linket på mandag.
Avatar billede ocp Nybegynder
16. november 2002 - 18:02 #12
Moralen er at du slet ikke behøver en cursor hvis du gør det på "min" måde.
Avatar billede ocp Nybegynder
16. november 2002 - 18:06 #13
Noget i denne stil:

declare @total as int
select @total = count(*) from #tbl

select data.felt1, data.felt2 --(evt også ,@total)
from  #tbl, data
where  #tbl.id = data.id
and    #tbl.nr between @start and @slut
Avatar billede peterlang Nybegynder
18. november 2002 - 14:57 #14
Undskyld, at der er gået noget tid, jeg har travt med at få en side færdig..
Jeg fik det til at virke med en tmp tabel.

Tak for jeres hjælp.
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