Хранимая процедура SQL работает, но с ошибками - PullRequest
0 голосов
/ 21 октября 2011

У меня есть таблица с 3 первичными ключами: CODE_TARIF, UNITE и MODE_LIV.

Я пишу хранимую процедуру для копирования и вставки, но с другими MODE_LIV.

ex:если у меня уже есть 2 строки в таблице T_TARIF с MODE_LIV = 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

Это работает, но выдает ошибку см.Видео: Странная хранимая процедура

Заранее спасибо, Стив

1 Ответ

1 голос
/ 21 октября 2011

Гадание ...

Вы используете синтаксис курсора ISO.По умолчанию это НЕ НЕДОПУСТИМО.Это означает, что когда вы вставляете строки, то при извлечении вы получаете строки, которые вы только что вставили и т. Д. И т. Д.

ОТ DECLARE CURSOR

DECLARE имя_ курсора [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]
...