2016-08-29 7 views
2

Ich habe eine TabelleAktualisieren einer Spalte Cursor mit Schleifen

| code | descd | slnum | 
|------|-------|-------| 
| 10 | a  | 0  | 
| 10 | b  | 0  | 
| 12 | c  | 0  | 
| 12 | d  | 0  | 
| 11 | e  | 0  | 
| 11 | f  | 0  | 

Und ich habe slnum Spalte wie diese mit Cursor mit Schleifen

| code | descd | slnum | 
|------|-------|-------| 
| 10 | a  | 1  | 
| 10 | b  | 2  | 
| 12 | c  | 1  | 
| 12 | d  | 2  | 
| 11 | e  | 1  | 
| 12 | f  | 3  | 

So aktualisieren dieses Problem zu beheben? Ich habe wie dieser versucht, aber seine was mir nicht korrekte Ausgabe

DECLARE @value INT 
DECLARE @s INT=1 

DECLARE scursor CURSOR FOR 

SELECT slnum 
FROM trec 
for update of slnum 

OPEN scursor 

FETCH NEXT FROM scursor 
INTO @value 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    if exists(select * from trec) -- missing 
    begin 
    update trec 
    set [email protected] 
    where current of scursor 
    select @[email protected]+1 
    end 
    else 
    begin 
    update trec 
    set [email protected]   
    where current of scursor 
    end 
    FETCH NEXT FROM scursor INTO @value 
END 

CLOSE scursor 
DEALLOCATE scursor 
+1

müssen Sie verwenden Cursor das zu tun? Es gibt einfachere Lösung, ohne Cursor – Squirrel

+0

so .. wie groß ist Ihr Tisch? – lordkain

+0

ja !! Ich möchte Cursor ist eine Hausaufgabe –

Antwort

0
DECLARE @descd varchar(3) 
DECLARE @codeOld int 
DECLARE @code int 
DECLARE @slnum int = 1      

DECLARE cur2 CURSOR 
    FOR 
    SELECT descd,code 
    FROM trec  
    ORDER BY code,descd   
    OPEN cur2 
    FETCH NEXT FROM cur2 INTO @descd, @code 
    WHILE @@FETCH_STATUS = 0 
    BEGIN  

     if @codeold = @code 
     begin 
     set @slnum = @slnum+1 
     end 
     else 
     begin 
     set @slnum = 1 
     end 

     UPDATE trec 
     SET slnum = @slnum     
     WHERE descd = @descd    
     SET @codeOld = @code     

     FETCH NEXT FROM cur2 INTO @descd, @code 
    END 

    CLOSE cur2 
    DEALLOCATE cur2 
2

Ich weiß nicht, ob Sie müssen einen Cursor verwenden, aber Ihre Frage ist ein toter Wecker für einen UPDATE mit verbinden, mit ROW_NUMBER :

UPDATE t1 
SET 
    slnum = t2.slnum 
FROM 
    yourTable t1 
INNER JOIN 
(
    SELECT code, 
      descd, 
      ROW_NUMBER() OVER(PARTITION BY code ORDER BY descd) AS slnum 
    FROM yourTable 
) t2 
    ON t1.code = t2.code AND 
     t1.descd = t2.descd 
+0

Ich weiß diese Dinge zu aktualisieren, aber mit einem Cursor ist Hausaufgaben für mich –

0
DECLARE @descd varchar(3) 
DECLARE @s int 

DECLARE scursor cursor local static forward_only read_only for 
SELECT descd, 
     row_number() over(partition by code order by descd) as s 
FROM trec 

OPEN scursor 

FETCH NEXT FROM scursor 
INTO @descd, @s 

WHILE @@fetch_status = 0 
BEGIN 
    update trec 
    set slnum = @s 
    where descd = @descd 

    FETCH NEXT FROM scursor 
    INTO @descd, @s 
END 

CLOSE scursor 
DEALLOCATE scursor 
0
DECLARE @descd varchar(3) 
DECLARE @codeOld int 
DECLARE @code int 
DECLARE @slnum int = 1     

DECLARE cur2 CURSOR 
    FOR 
    SELECT descd,code 
    FROM trec  
    ORDER BY code,descd   
    OPEN cur2 
    FETCH NEXT FROM cur2 INTO @descd, @code 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SELECT @slnum = CASE 
     WHEN @codeOld = @code 
     THEN @slnum + 1 
     ELSE 1 
     END 

     UPDATE trec 
     SET slnum = @slnum     
     WHERE descd = @descd    
     SET @codeOld = @code 

     FETCH NEXT FROM cur2 INTO @descd, @code  
    END 

    CLOSE cur2 
    DEALLOCATE cur2 
Verwandte Themen