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 strong> p> Je pense que je ne peux pas utiliser merci d'avance p> @@ fetch_status Code> Comme 1'st ligne telle qu'elle est globale. p>
4 Réponses :
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;
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. :)
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
Juste au cas où vous n'utilisez pas Courant de Strard>, vous pouvez utiliser 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;
***/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
Ce code met à jour toutes les lignes de
EMP code> pour chaque itération. Lorsque vous avez terminé tout
EMPNO code> 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! ;)