需要这样一个记录本-2 SQL Server触发器应用实例

利用SQL触发器,完成项目统计功能。加快程序查看报表的速度。

首先建立基础表:TB_IOModuleInput

/*******直接复制到SQL中查询分析器***********/

CREATE TABLE [dbo].[TB_IOModuleInput](
[FID] [int] IDENTITY(1,1) NOT NULL,
[FIOName] [varchar](32) NULL,
[FRecordDT] [datetime] NULL
) ON [PRIMARY]


建立统计结果表:TB_IOModule_Month_RP

/********按月统计IOName输入输出次数**********************/

/********年统计字段FTotal,利用SQL中‘计算所得的列规范’自动进行统计**********************/

CREATE TABLE [dbo].[TB_IOModule_Month_RP](
[FID] [int] IDENTITY(1,1) NOT NULL,
[FIOName] [nvarchar](32) NOT NULL,
[FJanurary] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FJanurary]  DEFAULT ((0)),
[FFebruary] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FFebruary]  DEFAULT ((0)),
[FMarch] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FMarch]  DEFAULT ((0)),
[FApril] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FApril]  DEFAULT ((0)),
[FMay] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FMay]  DEFAULT ((0)),
[FJune] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FJune]  DEFAULT ((0)),
[FJuly] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FJuly]  DEFAULT ((0)),
[FAugust] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FAugust]  DEFAULT ((0)),
[FSeptember] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FSeptember]  DEFAULT ((0)),
[FOctober] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FOctober]  DEFAULT ((0)),
[FNovember] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FNovember]  DEFAULT ((0)),
[FDecember] [int] NULL CONSTRAINT [DF_TB_Month_RP_IOName_FDecember]  DEFAULT ((0)),
[FTotal]  AS ((((((((((([FJanurary]+[FFebruary])+[FMarch])+[FApril])+[FMay])+[FJune])+[FJuly])+[FAugust])+[FSeptember])+[FOctober])+[FNovember])+[FDecember]) PERSISTED
) ON [PRIMARY]


对表TB_IOModuleInput建立Insert触发器:tg_IOModuleInput_Insert_MonthRP

/***************当TB_IOModuleInput表有新增加记录时,修改统计表TB_IOModule_Month_RP中对应记录***********/

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[tg_IOModuleInput_Insert_MonthRP]
   ON  [dbo].[TB_IOModuleInput] 
   AFTER INSERT
AS 
BEGIN TRANSACTION
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @MONTHINT int
DECLARE @IONAME VARCHAR(32)
select @MONTHINT = Datename(month, (select top(1) FRecordDT from INSERTED))
SELECT TOP(1) @IONAME = FIONAME FROM INSERTED
if (@MONTHINT = 1)
BEGIN
update TB_Month_RP_IOName set FJanurary = FJanurary + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 2)
BEGIN
UPDATE TB_Month_RP_IOName set FFebruary = FFebruary + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 3)
BEGIN
UPDATE TB_Month_RP_IOName set FMarch = FMarch + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 4)
BEGIN
UPDATE TB_Month_RP_IOName set FApril = FApril + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 5)
BEGIN
UPDATE TB_Month_RP_IOName set FMay = FMay + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 6)
BEGIN
UPDATE TB_Month_RP_IOName set FJune = FJune + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 7)
BEGIN
UPDATE TB_Month_RP_IOName set FJuly = FJuly + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 8)
BEGIN
UPDATE TB_Month_RP_IOName set FAugust = FAugust + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 9)
BEGIN
UPDATE TB_Month_RP_IOName set FSeptember = FSeptember + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 10)
BEGIN
UPDATE TB_Month_RP_IOName set FOctober = FOctober + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 11)
BEGIN
UPDATE TB_Month_RP_IOName set FNovember = FNovember + 1 WHERE FIONAME = @IONAME
END
ELSE IF (@MONTHINT = 12)
BEGIN
UPDATE TB_Month_RP_IOName set FDecember = FDecember + 1 WHERE FIONAME = @IONAME
END
ELSE
BEGIN
ROLLBACK
RETURN
END
    -- Insert statements for trigger here
select 1
COMMIT TRANSACTION


测试:

1.向统计表TB_IOModule_Month_RP中插入基础数据

INSERT INTO TB_MONTH_RP_IONAME (FIONAME) VALUES ( 'GAJ')

INSERT INTO TB_MONTH_RP_IONAME (FIONAME) VALUES ( 'KAJ')

INSERT INTO TB_MONTH_RP_IONAME (FIONAME) VALUES ( 'QDJ')

SELECT * FROM TB_MONTH_RP_IONAME

观察统计表中记录内容,所有月份统计信息全为0

2.向基础表中插入新记录

INSERT INTO TB_IOMODULEINPUT (FIONAME, FRECORDDT) VALUES ('GAJ', '2014-10-12 11:13:33')

INSERT INTO TB_IOMODULEINPUT (FIONAME, FRECORDDT) VALUES ('GAJ', '2014-11-12 11:13:33')

SELECT * FROM TB_MONTH_RP_IONAME

再次观察统计表中内容,发现‘GAJ’对应记录10月份为记数为1,11月份为记数为1,Total年总和为2

测试成功













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值