我有3个主键表:CODE_TARIF, UNITE
和MODE_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
提前谢谢你, 甜菊
答案 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]