SQL存储过程有效,但有错误

时间:2011-10-21 10:39:02

标签: sql stored-procedures while-loop

我有3个主键表:CODE_TARIF, UNITEMODE_LIV

我编写了一个存储过程来复制和粘贴,但使用不同的MODE_LIV

例如:如果我使用T_TARIF运行此存储过程时表MODE_LIV = 2,中已有2行MODE_LIV =3,那么我将有4行。

ALTER PROCEDURE [dbo].[Copy_Tarif]
    -- Add the parameters for the stored procedure here
  @MODE_LIV int
AS
BEGIN
    DECLARE @CODE_TARIF varchar(15)
    DECLARE @ZONE int
    DECLARE @UNITE int
    DECLARE @LIBELLE varchar(30)

    DECLARE @TR_DEB int
    DECLARE @TR_FIN int
    DECLARE @MONTANT decimal(18,2)


    DECLARE tarif_cursor CURSOR FOR     
    SELECT CODE_TARIF, ZONE, UNITE, LIBELLE, TR_DEBUT, TR_FIN, MONTANT
    FROM T_TARIF

    OPEN tarif_cursor;

    FETCH NEXT FROM tarif_cursor 
    INTO  @CODE_TARIF, @ZONE, @UNITE, @LIBELLE,  @TR_DEB, @TR_FIN, @MONTANT;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO [T_TARIF]
           ([CODE_TARIF]
           ,[ZONE]
           ,[UNITE] 
           ,[MODE_LIV]         
           ,[LIBELLE]
           ,[TR_DEBUT]
           ,[TR_FIN]
           ,[MONTANT]

           )
     VALUES
           (@CODE_TARIF
           ,@ZONE
           ,@UNITE   
           ,@MODE_LIV       
           ,@LIBELLE
           ,@TR_DEB
           ,@TR_FIN
           ,@MONTANT

           )

        FETCH NEXT FROM tarif_cursor
        INTO  @CODE_TARIF, @ZONE, @UNITE, @LIBELLE,  @TR_DEB, @TR_FIN, @MONTANT;



    END
END

虽然有效但出错了,请参阅视频:Strange Stored Procedure

提前谢谢你, 甜菊

1 个答案:

答案 0 :(得分:1)

猜测 ...

您正在使用ISO游标语法。这默认为INSENSITIVE。这意味着当你插入行时,你在FETCH中获得刚刚插入的行等等。

来自DECLARE CURSOR

  

DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR

     

定义一个游标,该游标用于生成游标要使用的数据的临时副本。所有对游标的请求都是从tempdb中的临时表中回答的;因此,对基表进行的修改不会反映在对此游标进行的提取返回的数据中,并且此游标不允许进行修改。 当使用ISO语法时,如果省略INSENSITIVE,则对后续表(由任何用户)进行的提交删除和更新将反映在后续提取中。

无论如何,您只需要:无需循环

 INSERT INTO [T_TARIF]
       ([CODE_TARIF]
       ,[ZONE]
       ,[UNITE] 
       ,[MODE_LIV]         
       ,[LIBELLE]
       ,[TR_DEBUT]
       ,[TR_FIN]
       ,[MONTANT])
 SELECT 
       [CODE_TARIF]
       ,[ZONE]
       ,[UNITE] 
       ,@MODE_LIV       
       ,[LIBELLE]
       ,[TR_DEBUT]
       ,[TR_FIN]
       ,[MONTANT]
 FROM
      [T_TARIF]