`
中华好儿孙
  • 浏览: 65996 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

sqlserver里的after insert触发器,使用游标版

    博客分类:
  • sql
阅读更多
CREATE TRIGGER [dbo].[actStatisticsTrigger_actObj_insert]
ON [dbo].[gl_activity_customer]
AFTER INSERT
AS
  DECLARE @assignId NVARCHAR(32) --活动执行人
  DECLARE @actObjCount NUMERIC(5) --统计变量
  DECLARE @actDate NVARCHAR(8)  --活动当天日期
  DECLARE @dayInWeek NVARCHAR(1) --活动当天是周几
  DECLARE @myFlag NVARCHAR(1) --标志

  --找出同一天的同一个活动执行人的銷售活動/開拓準保戶/拜訪影響力中心(C of I)之活動的活动对象总人数
  DECLARE myCursor CURSOR FOR --定义游标
  SELECT t2.assign_id, COUNT(t1.tid),CONVERT(NVARCHAR(8), t2.active_date, 112),t2.day_in_week, 'a'
  FROM inserted t1 inner join gl_activity t2 ON t1.activity_id = t2.tid 
       AND t2.type_a = 'AGY_STD__10' AND t2.type_b = 'AGY_STD__1002' AND t2.type_c = 'AGY_STD__100201' 
       AND t2.active_state = 'done' AND t2.status = '1' AND t1.status = '1'
  GROUP BY t2.assign_id, CONVERT(NVARCHAR(8), t2.active_date, 112),t2.day_in_week
  UNION ALL
  --找出同一天的同一个活动执行人的AGY和STD通路下的所有活動的所有活动对象的推介人数的总人数
  SELECT t2.assign_id, COUNT(t1.recoperson_num),CONVERT(NVARCHAR(8), t2.active_date, 112),t2.day_in_week, 'b'
  FROM inserted t1 inner join gl_activity t2 ON t1.activity_id = t2.tid 
       AND (t2.type_a LIKE '%AGY%' OR t2.type_a LIKE '%STD%')
  GROUP BY t2.assign_id, CONVERT(NVARCHAR(8), t2.active_date, 112),t2.day_in_week
  UNION ALL
  --找出同一天的同一个活动执行人的管理及增員活動/增員篩選/轉介紹名單(Ref)之活動所有活动对象的推介人数的总人数
  SELECT t2.assign_id, COUNT(t1.recoperson_num),CONVERT(NVARCHAR(8), t2.active_date, 112),t2.day_in_week, 'c'
  FROM inserted t1 inner join gl_activity t2 ON t1.activity_id = t2.tid 
       AND t2.type_a = 'AGY_STD__11' AND t2.type_b = 'AGY_STD__1101' AND t2.type_c = 'AGY_STD__110110' 
       AND t2.active_state = 'done' AND t2.status = '1' AND t1.status = '1'
  GROUP BY t2.assign_id, CONVERT(NVARCHAR(8), t2.active_date, 112),t2.day_in_week

  OPEN myCursor
  
    FETCH NEXT FROM myCursor INTO @assignId, @actObjCount, @actDate, @dayInWeek, @myFlag

    WHILE(@@FETCH_STATUS = 0)
    BEGIN
     IF(@myFlag = 'a' OR @myFlag = 'b')
     BEGIN
       DECLARE @var_count INT
       SELECT @var_count = COUNT(*) FROM gl_activity_sale_statistics WITH(TABLOCKX) WHERE date_now = @actDate AND agent_number = @assignId

       IF(@var_count = 0)
       BEGIN
            DECLARE @yearIn NVARCHAR(4) --活动当天所属年份
            DECLARE @quarterIn NVARCHAR(1) --活动当天所属季度
            DECLARE @monthIn NVARCHAR(2) --活动当天所属月份
            DECLARE @weekIn NVARCHAR(20) --周的标识

            SET @yearIn = DATEPART(yyyy, @actDate)
            SET @quarterIn = DATEPART(q, @actDate)
            SET @monthIn = DATEPART(mm, @actDate)
            SET @weekIn = dbo.getWeekInStr(@actDate)

            IF(CAST(@monthIn AS INT) < 10)
            BEGIN
                 SET @monthIn = '0' + @monthIn
            END
            
            IF(@myFlag = 'a')
            BEGIN
              INSERT INTO gl_activity_sale_statistics(tid, agent_number, year_in, quarter_in, month_in, week_in, day_in, date_now, is_plan, is_edit_byhand, AGY_STD__100201)
              VALUES(replace(newid(),'-',''), @assignId, @yearIn, @quarterIn, @monthIn, @weekIn, @dayInWeek, @actDate, '0', '0', @actObjCount)
            END
            IF(@myFlag = 'b')
            BEGIN
                 INSERT INTO gl_activity_sale_statistics(tid, agent_number, year_in, quarter_in, month_in, week_in, day_in, date_now, is_plan, is_edit_byhand, AGY_STD__A0_rec_people_num)
                 VALUES(replace(newid(),'-',''), @assignId, @yearIn, @quarterIn, @monthIn, @weekIn, @dayInWeek, @actDate, '0', '0', @actObjCount)
            END
       END
       ELSE
       BEGIN
            IF(@myFlag = 'a')
            BEGIN
              UPDATE gl_activity_sale_statistics 
              SET AGY_STD__100201 = ISNULL(AGY_STD__100201, 0) + @actObjCount 
              WHERE agent_number = @assignId AND date_now = @actDate AND is_edit_byhand = '0'
            END
            IF(@myFlag = 'b')
            BEGIN
              UPDATE gl_activity_sale_statistics 
              SET AGY_STD__A0_rec_people_num = ISNULL(AGY_STD__A0_rec_people_num, 0) + @actObjCount 
              WHERE agent_number = @assignId AND date_now = @actDate AND is_edit_byhand = '0'
            END
       END
     END
     
     IF(@myFlag = 'c')
     BEGIN
       DECLARE @var_count2 INT
       SELECT @var_count2 = COUNT(*) FROM gl_activity_emp_statistics WITH(TABLOCKX) WHERE date_now = @actDate AND agent_number = @assignId
       IF(@var_count2 = 0)
       BEGIN
              INSERT INTO gl_activity_emp_statistics(tid, agent_number, year_in, quarter_in, month_in, week_in, day_in, date_now, is_plan, is_edit_byhand, AGY_STD__110110)
              VALUES(replace(newid(),'-',''), @assignId, @yearIn, @quarterIn, @monthIn, @weekIn, @dayInWeek, @actDate, '0', '0', @actObjCount)
       END
       ELSE
       BEGIN
              UPDATE gl_activity_emp_statistics 
              SET AGY_STD__110110 = ISNULL(AGY_STD__110110, 0) + @actObjCount 
              WHERE agent_number = @assignId AND date_now = @actDate AND is_edit_byhand = '0'
       END
     END

       FETCH NEXT FROM myCursor INTO @assignId, @actObjCount, @actDate, @dayInWeek, @myFlag
    END

  CLOSE myCursor



  
GO
分享到:
评论

相关推荐

    sqlserver触发器例子

    sqlserver触发器例子 一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕ SQL ...

    SQL Server数据库实验_存储过程与触发器设计.docx

    SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。...

    Sql Server触发器的使用

    Sql Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护,它们存在于内存中而不是数据库中。这两个表的结构总是与被该触发器作用的表的结构相同,触发器执行完成后,与该触发器...

    sqlserver 触发器学习(实现自动编号)

    总结常用基本点如下: 1、触发器有两种... 2、DML触发器分类:Insert触发器、Delete触发器、Update触发器、上面任意类型混合。 3、触发器创建语法: 代码如下: CREATE TRIGGER &lt;trigger&gt; ON &lt;table&gt; {{{FOR|AFTER} &lt;

    SQL Server:触发器实例详解

    SQL Server2000提供了两种触发器:“Instead of” 和“After” 触发器。 一个表或视图的每一个修改动作(Insert、Update和Delete)都可以有一个“Instead of” 触发器,一个表的每个修改动作都可以有多个“After”...

    SQLServer2005考试题及答案

    SQLServer考试题及答案 选择题: 1、在MS SQL Server中,用来显示数据库信息的系统存储过程是( ) A sp_ dbhelp B sp_ db C sp_ help D sp_ helpdb 2、SQL语言中,删除一个表的命令是( ) A DELETE B DROP C ...

    基于SQLserver的学生选课系统

    AFTER INSERT, UPDATE AS BEGIN UPDATE Dept_age SET Avg_age = ( SELECT AVG(Sage) FROM Student WHERE Student. Sdept = Dept_age. Sdept) WHERE Sdept IN ( SELECT Sdept FROM inserted ); INSERT INTO ...

    SQL Server 触发器 表的特定字段更新时,触发Update触发器

    代码如下: create trigger TR_MasterTable_Update on MasterTable after update as if update ([Type])–当Type字段被更新时,才会触发此触发器 insert into MasterLogTable select Id ,(Case [Type] when 1 then ...

    SQL server 语句大全

    目录 SQL语法 2 数据库 5 创建数据文件 5 修改数据库 6 删除 7 数据表 8 判断数据库中的某表是否存在,存在删除该表 8 修改表语法 8 ... 使用触发器方法其一 —— 判断 24 数据库备份和恢复 25

    Oraclet中的触发器

    触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。  触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;  由触发器所调用的过程或函数也不能...

    SQL SERVER中各类触发器的完整语法及参数说明

    语法:Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH &lt;dml&gt; [ ,…n ] ] { FOR | AFTER | ...

    数据库编程期末答疑,卷子讲解,SQL server相关操作讲解,如有侵权请联系删除

    乐山师范学院数据库编程期末答疑,卷子讲解,SQL server相关 如下是一个简化的员工考勤应用E-R图,请在SQL Server中创建名为YQKG的数据库,包括两个数据文件,一个日志文件,文件名按SQL Server对象命名规范定义,...

    数据库触发器是一种存储过程

    触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,当在表(视图)中插入、更新、删除记录时,触发一个或一系列 T-SQL 语句。 触发器分为两种...

    SQLServer EVENTDATA()函数来获取DDL 触发器信息

    代码如下:— Create a log table CREATE TABLE TriggerLog (LogInfo xml) — Create a dummy table to delete later on CREATE TABLE TableToDelete (Id int PRIMARY KEY) — 新建一个新表,作为删除实验表 INSERT ...

    oracle实验报告

    (6)在一个单独的表上,最多只能创建三个触发器与之关联,一个INSERT触发器,一个DELETE触发器和一个UPDATE触发器。 1. 实例讲解Oracle数据库自带的几个触发器 Oracle数据库自带的几个触发器(最简单触发器格式)...

    SQL数据库设计命名规范.pdf

    附录 2 SQL Server 数据库命名与编码规范 一.数据库对象命名基本规范 1. 总体命名规范 名称的长度不超过 32 个字符。 名称采用英文单词、英文单词缩写和数字,单词之间用"_"分隔。 说明:除非用户提供文档化的行业...

    mysql数据库的基本操作语法

    提示:索引保存在information_schema数据库里的STATISTICS表中。 创建索引方式: 自动:当表上定义主键约束、唯一、外键约束时,该表会被系统自动添加上索引。 手动:手动在相关表或列上增加索引,提高查询速度。 ...

Global site tag (gtag.js) - Google Analytics