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

sqlserver中编写的after insert触发器

    博客分类:
  • sql
阅读更多
CREATE TRIGGER [dbo].[actStatisticsTrigger_insert]
ON [dbo].[gl_activity]
AFTER INSERT
AS
DECLARE @counntOfInsert INT
--考虑到一条insert语句插入多条记录的情况
SELECT @counntOfInsert = COUNT(*) FROM inserted
WHILE(@counntOfInsert > 0)
BEGIN
DECLARE @firstRankType NVARCHAR(40) --第一级的活动类型
DECLARE @secondRankType NVARCHAR(40) --第二级的活动类型
DECLARE @thirdRankType NVARCHAR(40) --第三极的活动类型
DECLARE @activeDate NVARCHAR(8) --活动举行的日期 字符串,不带-的YYYYMMDD形式
DECLARE @activeHours NUMERIC(4,1) --活动持续的小时数,精确到小数点后一位
DECLARE @assignId NVARCHAR(32) --活动执行人
DECLARE @dayInWweek NVARCHAR(1) --活动所在的日期是周几
DECLARE @actState NVARCHAR(20)
DECLARE @actStatus NVARCHAR(2)

SELECT @actStatus = tt.status, @actState = tt.active_state, @firstRankType = tt.type_a, @secondRankType = tt.type_b, @thirdRankType = tt.type_c, @activeDate = CONVERT(NVARCHAR(8), tt.active_date, 112), @activeHours = tt.active_hours, @assignId = tt.assign_id, @dayInWweek = tt.day_in_week FROM inserted tt WHERE (SELECT COUNT(*) FROM inserted tmp WHERE tmp.tid <= tt.tid ) = @counntOfInsert

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

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

IF(CAST(@monthIn AS INT) < 10)
BEGIN
     SET @monthIn = '0' + @monthIn
END



IF(@actStatus = '1' and @actState = 'done')
BEGIN
  --更新gl_activity_time_statistics
  IF(@firstRankType = 'AGY_STD__10' OR @firstRankType = 'AGY_STD__11' OR ((@firstRankType not like '%AGY%') AND (@firstRankType not like '%STD%')))
  BEGIN
       DECLARE @var_count INT
       --给时间统计表加锁,不允许别的事务读取和操作这张表,直至本事务结束
       SELECT @var_count = COUNT(*) FROM gl_activity_time_statistics WITH(TABLOCKX) WHERE date_now = @activeDate AND agent_number = @assignId

       IF(@var_count = 0)
       BEGIN
            DECLARE @insertSql NVARCHAR(500)
            DECLARE @insertNewId NVARCHAR(32)
            SET @insertNewId = replace(newid(),'-','')
            --sql中用两个单引号来表示一个单引号
            SET @insertSql = 'INSERT INTO gl_activity_time_statistics(tid, agent_number, year_in, quarter_in, month_in, week_in, day_in, date_now, is_plan, is_edit_byhand, ' + @secondRankType +' ) values(''' + @insertNewId + ''', ''' + @assignId + ''', ''' + @yearIn + ''', ''' + @quarterIn + ''', ''' + @monthIn + ''', ''' + @weekIn + ''', ''' + @dayInWweek + ''', ''' + @activeDate + ''', ''0'', ''0'', ' + CAST(@activeHours AS NVARCHAR(10)) + ')' 
            exec(@insertSql)
       END
       ELSE
       BEGIN
            DECLARE @updateSql NVARCHAR(500)
            SET @updateSql = 'update gl_activity_time_statistics set ' + @secondRankType + ' = ISNULL(' + @secondRankType + ',0) + ' + CAST(@activeHours AS NVARCHAR(10)) + ' where agent_number = ''' + @assignId + ''' and date_now = ''' + @activeDate + ''' and is_edit_byhand = ''0'''
            exec(@updateSql)
       END
  END
  --更新gl_activity_sale_statistics
  IF((@firstRankType = 'AGY_STD__10' AND (@secondRankType = 'AGY_STD__1001' OR @secondRankType = 'AGY_STD__1002') AND @thirdRankType <> 'AGY_STD__100201') OR (@firstRankType like '%BR%' OR @firstRankType like '%BD%'))
  BEGIN
       DECLARE @var_count2 INT
       SELECT @var_count2 = COUNT(*) FROM gl_activity_sale_statistics WITH(TABLOCKX) WHERE date_now = @activeDate AND agent_number = @assignId
       
       IF(@var_count2 = 0)
       BEGIN
            DECLARE @insertSql2 NVARCHAR(500)
            DECLARE @insertNewId2 NVARCHAR(32)
            SET @insertNewId2 = replace(newid(),'-','')
            SET @insertSql2 = '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, ' + @thirdRankType +' ) values(''' + @insertNewId + ''', ''' + @assignId + ''', ''' + @yearIn + ''', ''' + @quarterIn + ''', ''' + @monthIn + ''', ''' + @weekIn + ''', ''' + @dayInWweek + ''', ''' + @activeDate + ''', ''0'', ''0'', ' + CAST(1 AS NVARCHAR(10)) + ')' 
            exec(@insertSql2)
       END
       ELSE
       BEGIN
            DECLARE @updateSql2 NVARCHAR(500)
            SET @updateSql2 = 'update gl_activity_sale_statistics set ' + @thirdRankType + ' = ISNULL(' + @thirdRankType + ',0) + ' + CAST(1 AS NVARCHAR(10)) + ' where agent_number = ''' + @assignId + ''' and date_now = ''' + @activeDate + ''' and is_edit_byhand = ''0'''
            exec(@updateSql2)
       END
  END
  --更新更新gl_activity_emp_statistics
  IF(@firstRankType = 'AGY_STD__11' AND @secondRankType = 'AGY_STD__1101' AND @thirdRankType <> 'AGY_STD__110110')
  BEGIN
       DECLARE @var_count3 INT
       SELECT @var_count3 = COUNT(*) FROM gl_activity_emp_statistics WITH(TABLOCKX) WHERE date_now = @activeDate AND agent_number = @assignId

       IF(@var_count3 = 0)
       BEGIN
            DECLARE @insertSql3 NVARCHAR(500)
            DECLARE @insertNewId3 NVARCHAR(32)
            SET @insertNewId3 = replace(newid(),'-','')
            SET @insertSql3 = '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, ' + @thirdRankType +' ) values(''' + @insertNewId + ''', ''' + @assignId + ''', ''' + @yearIn + ''', ''' + @quarterIn + ''', ''' + @monthIn + ''', ''' + @weekIn + ''', ''' + @dayInWweek + ''', ''' + @activeDate + ''', ''0'', ''0'', ' + CAST(1 AS NVARCHAR(10)) + ')' 
            exec(@insertSql3)
       END
       ELSE
       BEGIN
            DECLARE @updateSql3 NVARCHAR(500)
            SET @updateSql3 = 'update gl_activity_emp_statistics set ' + @thirdRankType + ' = ISNULL(' + @thirdRankType + ',0) + ' + CAST(1 AS NVARCHAR(10)) + ' where agent_number = ''' + @assignId + ''' and date_now = ''' + @activeDate + ''' and is_edit_byhand = ''0'''
            exec(@updateSql3)
       END
  END
END
SET @counntOfInsert = @counntOfInsert - 1
END
GO
分享到:
评论

相关推荐

    sqlserver触发器例子

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

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

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

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

    DML触发器:在用户对数据库执行数据操作时发生,触发器中的代码会被自动调用。 2、DML触发器分类:Insert触发器、Delete触发器、Update触发器、上面任意类型混合。 3、触发器创建语法: 代码如下: CREATE TRIGGER ...

    SQLServer2005考试题及答案

    建立一个INSTEAD OF INSERT触发器来产生一个新的保单号,并将这个保单号插入数据表中。 b.建立一个INSTEAD OF UPDATE触发器来产生一个新的保单号,并将这个保单号插入数据表中。 c.建立一个AFTER UPDATE触发器来产生...

    SQL Server:触发器实例详解

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

    Sql Server触发器的使用

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

    基于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 语句大全

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

    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中各类触发器的完整语法及参数说明

    语法: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 | ...

    Oraclet中的触发器

    WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。 当一个基表被修改时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用...

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

    如下是一个简化的员工考勤应用E-R图,请在SQL Server中创建名为YQKG的数据库,包括两个数据文件,一个日志文件,文件名按SQL Server对象命名规范定义,数据文件按10%的比例增长,数据库定义完成后输入如下样本数据。...

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

    触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,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数据库的基本操作语法

    MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息; 约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 常用五类约束: ...

Global site tag (gtag.js) - Google Analytics