我现在的位置:

微知识 - 知识分享 - 电脑网络 - 数据库
知识分享
  1. SQL 触发器游标使用示例。

    分享时间:2020-02-06 22:30:20会员:bekda目录:电脑网络 - 数据库浏览:1621 次

    USE [ATT2018]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER TRIGGER [dbo].[Check_Update]	--首次创建CREATE,后续修改ALTER:更新、新增触发器
       ON  [dbo].[Checkinout]	----在指定表中创建触发器
       AFTER INSERT,UPDATE	--更新、新增事件触发
    AS	--执行SQL语句
    
    DECLARE @TemLogid AS varchar(20)	--定义变量
    SELECT @TemLogid=Logid FROM inserted	--变量赋值:临时表inserted
    
    IF EXISTS(SELECT Logid FROM XF2020..CheckDate WHERE XF2020..CheckDate.Logid=@TemLogid)	--如果记录已存在,执行UPDATE操作
    BEGIN
    
    	UPDATE XF2020..CheckDate SET
    		XF2020..CheckDate.Userid=inserted.Userid,
    		XF2020..CheckDate.CheckTime=inserted.CheckTime,
    		XF2020..CheckDate.Sensorid=inserted.Sensorid,
    		XF2020..CheckDate.AttFlag=inserted.AttFlag
    	FROM inserted WHERE XF2020..CheckDate.Logid=@TemLogid
    
    END
    
    ELSE IF @TemLogid IS NOT NULL	--如果记录不存在且索引变量不为空,执行INSERT操作
    BEGIN
    
    	SET IDENTITY_INSERT XF2020..CheckDate ON	--允许主键插入显式值	
    
    	DECLARE mycursor CURSOR FOR SELECT * FROM inserted	--定义游标
    	DECLARE @Logid AS int,@Userid AS varchar(20),@CheckTime AS datetime,@CheckType AS int,@Sensorid AS int,@WorkType AS int,@AttFlag AS int,@Checked AS bit,@Exported AS bit,@OpenDoorFlag AS bit --定义变量,必须与表的所有字段一一对应
    	OPEN mycursor	--打开游标
    	
    	--FETCH参数:PRIOR 前一行 | NEXT 下一行| FIRST 第一行 | LAST 最后一行 | ABSOLUTE { n | @nvar} 绝对行 | RELATIVE { n | @nvar}  相对行 
    	--将游标行中的列字段数据从左到右依次放到局部变量中。
    	--变量数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。
    	--变量的数目必须与游标选择列表中的列数一致
    	FETCH NEXT FROM mycursor INTO @Logid,@Userid,@CheckTime,@CheckType,@Sensorid,@WorkType,@AttFlag,@Checked,@Exported,@OpenDoorFlag	--游标指向下一行数据,如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。
    	WHILE (@@fetch_status=0)	--当游标能成功读取下一条数据时
    	BEGIN
    	  	INSERT INTO XF2020..CheckDate(
    			Logid,
    			Userid,
    			CheckTime,
    			Sensorid,
    			AttFlag
    		)VALUES(
    			@Logid,
    			@Userid,
    			@CheckTime,
    			@Sensorid,
    			@AttFlag
    		)
    		FETCH NEXT FROM mycursor INTO @Logid,@Userid,@CheckTime,@CheckType,@Sensorid,@WorkType,@AttFlag,@Checked,@Exported,@OpenDoorFlag
    	END
    	CLOSE mycursor	--通过释放当前结果集并且解除定位游标的行上的游标锁定,关闭一个开放的游标,close后,如果再次打开游标还可以照常使用
    	DEALLOCATE mycursor	--删除游标引用,释放了游标占用的内存空间,DEALLOCATE后,如果再想使用游标,必须从新建立
    
    END

联系方式:

南京贝加达电子科技有限公司

  • 地址:南京市江北新区柳州北路21号涤太太科技大楼2F
  • 联系人:焦倩华(先生)
  • 手机:13813916308
  • 邮箱:Ser@bekda.com
  • 服务专线:400-8282-116
©2010-2024 Bekda Electronic Technology Co., Ltd. All right reserved.

苏公网安备 32011102010041号

320111201705278429

苏ICP备12027725号