7
votes

Comment utiliser le curseur pour mettre à jour l'enregistrement

J'utilise ci-dessous Requête pour mettre à jour mon tout enregistrement, mais il commence la mise à jour de la deuxième ligne Comment puis-je le modifier pour faire des changements de 1'st Row?

J'utilise MSSQL 2008

Je pense que je ne peux pas utiliser @@ fetch_status Comme 1'st ligne telle qu'elle est globale.

merci d'avance xxx


3 commentaires

Ce code met à jour toutes les lignes de EMP pour chaque itération. Lorsque vous avez terminé tout EMPNO a la même valeur.


Pouvez-vous nous donner des données "avant" et "après"? Vous pouvez le faire dans une seule déclaration, pas de curseur ...


Chaque fois que vous utilisez un curseur, une fée SQL monte en flammes! ;)


4 Réponses :


23
votes

On dirait que vous souhaitez attribuer une valeur incrémentée à EMPNO à partir de 10.

Vous pouvez utiliser un CTE et Row_Number () pour le faire. Pas besoin d'un curseur. P>

DECLARE @empno AS INT;
DECLARE @CurEmpNo AS INT;

SELECT @empno = 10;

DECLARE employee_cursor CURSOR FOR
  SELECT empno
  FROM   emp

OPEN employee_cursor;

FETCH NEXT FROM employee_cursor INTO @CurEmpNo

WHILE @@FETCH_STATUS = 0
  BEGIN
      UPDATE emp
      SET    empno = @empno
      WHERE  CURRENT OF employee_cursor;

      SELECT @empno = @empno + 1;

      FETCH NEXT FROM employee_cursor INTO @CurEmpNo
  END;

CLOSE employee_cursor;

DEALLOCATE employee_cursor;  


2 commentaires

Je souhaite plus de réponses comme celle-ci. La première chose était la "je pense que tu devrais probablement faire une meilleure façon", mais pour répondre à la question inclure également la réponse réelle.


Cette réponse m'a essentiellement appris plusieurs nouvelles astuces en une fois. :)



1
votes

Les curseurs ne sont généralement pas une bonne solution, donc une solution telle que @mikael Eriksson est potentiellement meilleure. Toutefois, si vous devez vraiment utiliser un curseur pour effectuer une mise à jour, vous devez le marquer comme insensible:

DECLARE Employee_Cursor INSENSITIVE CURSOR FOR
SELECT empno FROM emp


0 commentaires

-1
votes

Juste au cas où vous n'utilisez pas Courant de Strard>, vous pouvez utiliser ROW_NUMHOMBER STROND> comme référence pour le mettre à jour.

DECLARE @empno AS INT;
DECLARE @CurEmpNo AS INT;

SELECT @empno = 10;

DECLARE employee_cursor CURSOR FOR
  SELECT empno
  FROM   emp

OPEN employee_cursor;

FETCH NEXT FROM employee_cursor

WHILE @@FETCH_STATUS = 0
  BEGIN
      SELECT @CurEmpNo = @CurEmpNo + 1, @empno = @empno + 1

      ;With C As(
           Select empno, 
           ROW_NUMBER() OVER (ORDER BY empno DESC) AS RowNo
           From emp
      )

      UPDATE C 
      SET    empno = @empno
      WHERE  RowNo = @CurEmpNo;

      FETCH NEXT FROM employee_cursor 
  END;

CLOSE employee_cursor;

DEALLOCATE employee_cursor;


0 commentaires

0
votes
***/Update Multiple Record Using Curser In SQl /***

  CREATE PROCEDURE [dbo].[SP_UpdateDatausingCursor_Update]
    (
    @Msg NVARCHAR(MAX)=null OUTPUT
    )
    AS
    BEGIN 

    /**Declare Cursor**/
    DECLARE @TCursor CURSOR

    /**Declare Cursor**/

    DECLARE @Code bigint=null,@ComId int=null,@JDate DATE=null,@LDate DATE=null

    /**Creating TempDetails Table**/
    CREATE TABLE #TempDetails
    (Code BIGINT,ComId INT,JDate DATE,LDate DATE)
    /**Creating TempDetails Table**/

    INSERT INTO #TempDetails(Code,ComId,JDate,LDate)
    (
    SELECT DISTINCT Code,ComId,JDate,LDate FROM tbl_FormRecord /*GEt Data From table*/
    )

    SET @TCursor =CURSOR FOR SELECT Code,ComId,JDate,LDate FROM #TempDetails
    OPEN @TCursor 
    FETCH NEXT FROM @TCursor INTO @Code,@ComId,@JDate,@LDate
    WHILE @@FETCH_STATUS=0
            BEGIN
                    UPDATE tbl_Form2
                    SEt JDate=@JDate,
                    LDate=@LDate
                    WHERE Code=@Code AND ComId=@ComId   

                    FETCH NEXT FROM @TCursor INTO @Code,@ComId,@JDate,@LDate
            END
            SET @Msg='DATE Updated Successfully.'
    DEALLOCATE @TCursor
    SELECT * FROM #TempDetails
    DROP TABLE #TempDetails
    END 

0 commentaires