Autor Beitrag
inkoknito
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mo 27.07.09 12:02 
Hallo Leute,

ich weise zur Laufzeit einer TQuery-Komponente aus einer txt-Datei einen etwas umfangreichere SQL-Block zu. In diesem SQL-Block wird unter anderem auch ein Cursor deklariert was so allerdings nicht ganz hinhaut. Bekomme immer den Fehler: "DECLARE CURSOR muss einzige Anweisung in Abfrage-Anweisungsfolge sein". Ich brauche diesen Cursor dort allerdings weil mit temporären Tabellen gearbeitet wird und auf diese Ergebniss zugegriffen wird. Hat jemand eine Idee, wie ich das ganze zum Laufen bringen kann? Hier mal die Anweisung (etwas abgespeckt):

ausblenden volle Höhe SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
select 0 as ZAEHLER,*
 into #TABELLE_B
 from TABELLE_A
 order by FELD1, FELD2, FELD3

select distinct 0 as ZAEHLER, FELD1, FELD2 
into   #temp1
 from  #TABELLE_B
 group by FELD1, FELD2

select * 
  into #zaehler
  from #temp1
truncate table #zaehler

declare cursor_zaehler cursor for
 select FELD1+FELD2 from #temp1
  order by FELD1,FELD2

declare @zaehler   int
select @zaehler = 0

declare @vgl_feld1 char(7)
select @vgl_feld1 = '1'

declare @feld1_feld2     char(12)
open cursor_zaehler

fetch cursor_zaehler into @feld1_feld2
while @@sqlstatus !=2
    begin
        if @@sqlstatus =1
            begin
               print "Fehler beim fetchen"
               return
            end
       else
            begin
                 print @feld1_feld2
                 
                 if @vgl_feld1<>substring(@feld1_feld2,1,7)
                   Begin 
                      select @zaehler = 1
                   End 
                 else      
                   Begin
                      select @zaehler = @zaehler+1
                   End 

                 insert #zaehler
                 select @zaehler as ZAEHLER, FEDL1, FELD2
                   from #temp1
                  where FELD1+FELD2=@feld1_feld2

                 select @vgl_feld1=substring(@feld1_feld2,1,7)

            end

       fetch cursor_zaehler into @feld1_feld2
    end

close cursor_vkl
deallocate cursor cursor_vkl


update  #TABELLE_B
 set   a.ZAEHLER = b.ZAEHLER
 from  #TABELLE_B a,#temp1 b
 where a.FELD1=b.FELD1
 and a.FELD2=b.FELD2


Ziel des Cursor ist es, eine Nummerierung in Gruppen durchzuführen, bei Gruppenwechsel (FELD1) soll die Nummerierung bei 1 beginnen.

FELD1 FELD2 ZAEHLER
1 a 1
1 b 2
2 d 1
3 b 1
3 c 2

.....
davidbaumann
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 39

Win XP
D7PE
BeitragVerfasst: Do 20.08.09 10:28 
Hallo,

ich hätte das ohne Cursor gelöst.
Habe gerade mal dein Beispiel umgesetzt.

1. Erstelle ich eine temporäre Tabelle:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
create table #temp
(
col1 int not NULL IDENTITY (11),
wert1 varchar(5),
wert2 varchar(5)
)


2. Schreibe ich die Daten in der Reihenfolge, in der sie später erscheinen sollen, in die Tabelle.
In deinem Fall wäre das wohl ein "Select ... from ... into #temp".
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
insert into #temp
values ('1''a')

insert into #temp
values ('1''b')

insert into #temp
values ('1''c')

insert into #temp
values ('2''d')

insert into #temp
values ('3''b')

insert into #temp
values ('3''c')


3. Danach selektiere ich die Daten:
ausblenden SQL-Anweisung
1:
2:
3:
select *, (select COUNT(*)+1 from #temp t2 where t1.wert1=t2.wert1 and t1.col1>t2.col1) as Zahler
from #temp t1
order by col1

Der Subselect zählt alle Datensätze, die vor dem aktuellen stehen, und gibt die Zahl als Spalte aus.

4. Danach nur noch die temporäre Tabelle entfernen:
ausblenden SQL-Anweisung
1:
drop table #temp					


Ergebis schaut so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
col1        wert1 wert2 Zahler
----------- ----- ----- -----------
1           1     a     1
2           1     b     2
3           1     c     3
4           2     d     1
5           3     b     1
6           3     c     2