`
中华好儿孙
  • 浏览: 68719 次
  • 性别: 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 触发器学习(实现自动编号)

    - 在INSERT触发器中,插入的行会被复制到一个名为Inserted的临时表。 - DELETE触发器会将被删除的行复制到Deleted表。 - UPDATE触发器则同时有Inserted和Deleted表,分别代表更新前后的状态。 6. **性能考虑**:...

    基于sql server 2005的触发器的创建及操作

    2. 使用T-SQL:直接在查询编辑器中编写CREATE TRIGGER语句。例如,创建一个AFTER UPDATE触发器,确保员工薪水不降低: ```sql CREATE TRIGGER trg_Employee_Salary_Update ON Employee AFTER UPDATE AS BEGIN IF ...

    16.sql.server.2005.触发器 16.sql.server.2005.触发器

    - 避免在触发器中进行循环引用,这可能导致无限递归。 - 由于触发器在用户不可见的情况下运行,调试和问题定位可能更具挑战性。 - 触发器不应用于处理业务逻辑,而应主要用于数据完整性或审计目的。 6. **触发器...

    sql server 2005学习笔记之触发器

    SQL Server 2005中的触发器是一种特殊类型的存储过程,它们在特定的T-SQL语句执行时自动触发,增强了数据库的逻辑控制能力。触发器主要分为两类:DML触发器和DDL触发器。 DML触发器是针对数据操纵语言(Data ...

    sqlserver触发器例子

    SQL Server 2000 支持两种类型的触发器:Instead Of 触发器和 After 触发器。 - **Instead Of 触发器**:这种类型的触发器用于替代引起触发器执行的T-SQL语句。它可以用于表和视图,以扩展视图可以支持的更新操作。 ...

    SqlServer触发器写法案例

    在这个触发器中: - 使用`AFTER INSERT`指定了触发器类型,即在插入操作完成之后执行。 - `inserted`是一个特殊的表,包含了所有由触发事件所插入的新行。 - 通过`JOIN`操作获取了需要更新的类别ID以及对应的数量。 ...

    SqlServer触发器调用WebService

    此外,这种方法还可以方便地扩展到其他类型的Web服务调用,只需修改触发器中的URL和方法名即可。 综上所述,利用Sql Server触发器调用WebService是一种高效且灵活的方式,可以极大地提高系统的自动化程度,减少手动...

    SQLserver08触发器

    一个简单的AFTER INSERT触发器,当向表中插入新数据时,自动更新另一个关联表: ```sql CREATE TRIGGER trg_AfterInsertExample ON Table1 AFTER INSERT AS BEGIN INSERT INTO Table2 (Column1) SELECT ...

    sqlserver 创建触发器 远程服务器相应执行SQL语句

    本文将详细介绍如何在SQL Server中创建触发器来实现当本地数据库发生数据插入时,在远程服务器上相应地执行SQL语句,实现数据同步。这通常用于需要跨数据库同步数据的应用场景。 #### 准备工作 在开始之前,确保...

    sql server 2005第十二课(sql server触发器)

    例如,假设我们想要在上面的触发器中增加一个新的逻辑: ```sql ALTER TRIGGER trg_Employees_Insert ON Employees AFTER INSERT AS BEGIN UPDATE inserted SET EmployeeID = NEXT VALUE FOR EmployeeIDSeq ...

    SQL server存储过程习题,SQL触发器习题.rar

    在SQL Server数据库管理系统中,存储过程和触发器是两种非常重要的数据库编程元素,它们对于数据库设计和数据管理具有深远的影响。下面将详细讲解这两个概念及其相关的知识点。 **SQL存储过程**: 1. **定义**:SQL...

    SQL_Server触发器创建、删除、修改、查看示例

    在 SQL Server 中,触发器是一种特殊类型的存储过程,它自动执行响应数据更改(如 INSERT、UPDATE 或 DELETE)操作。触发器可以确保数据完整性,并允许数据库开发者在数据更改时执行自定义逻辑。 本文将详细介绍 ...

    第05节:SQLServer触发器Demo源代码.rar

    这个资源“第05节:SQLServer触发器Demo源代码.rar”很可能是包含了一个C#项目,该项目演示了如何在应用程序中创建、使用和管理SQL Server触发器。通过学习和理解这些示例代码,开发者可以更好地掌握在C#环境中操作...

    SQL SERVER 触发器视频讲解

    在本视频教程中,您将学习到如何根据实际需求创建和使用触发器,包括编写触发器的语法、触发器中的临时表、OUTPUT关键字的应用,以及如何调试和优化触发器。通过实例演示,让理论知识与实践操作相结合,使您能够熟练...

    SqlServer2000触发器

    - 触发器中的事务处理必须谨慎,否则可能导致死锁或其他并发问题。 - 由于触发器是透明的,可能隐藏了业务逻辑,使得调试和维护变得更加困难。 ### 5. 关联资源 虽然提供的压缩包文件名称为`java常用资料.pdf`,但...

    SQL Server中存储过程与触发器技术的研究与应用.pdf

    - 在触发器中应避免使用复杂的逻辑,以确保事务的快速响应。 - 对于触发器执行中产生的错误,应该有明确的错误处理机制。 通过合理地应用存储过程和触发器,开发者可以有效提升SQL Server数据库的性能和应用程序的...

    sql server触发器.rar

    - 在一个示例中,我们可以创建一个INSERT触发器,确保每当向员工表插入新记录时,都会自动计算员工的入职年份。 - 另一个例子是使用UPDATE触发器来实现参照完整性的级联更新,当父表的某个字段更改时,自动更新...

    SQL Server 利用触发器对多表视图进行更新的实现方法

    在SQL Server中,触发器是一种特殊的存储过程,它在数据更改操作(如INSERT、UPDATE或DELETE)发生时自动执行。本示例展示了如何利用触发器来实现对多表视图的更新,具体涉及了以下几个关键知识点: 1. **触发器的...

    sqlserver2005学习笔记之触发器简介.pdf

    SQL Server 2005中的触发器是一种特殊类型的存储过程,它会在执行特定的T-SQL语句(如INSERT、UPDATE、DELETE)时自动触发执行。触发器的主要作用在于增强数据的完整性和有效性,它们能完成比约束更复杂的数据验证,...

Global site tag (gtag.js) - Google Analytics