需要这样一个记录本-2 SQL Server触发器应用实例
2014-09-18 10:59
351 查看
利用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
测试成功
首先建立基础表: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
测试成功
相关文章推荐
- 需要这样一个记录本-7 C#字符串与字节数组相互转换
- 需要这样一个记事本-11 完成端口IOCP应用问题记录
- 需要这样一个记录本-5 VS2010调试C#项目时提示“当前不会命中断点。还没有为该文档为载任何符号”
- 需要这样一个记录本-9 Delphi使用TADOQuery时提示:不正常地定义参数对象。提供了一不致或不完整的信息。
- 需要这样一个记录本-3 Delphi调用Windows自带图片查看器
- 需要这样一个记录本-10 delphi窗体停靠Dock功能实现
- 需要这样一个记录本-8 Delphi读写UTF-8、Unicode格式文本文件
- 需要这样一个记录本-1 C#托管内存与非托管内存相互转换
- 需要这样一个记录本-4 C#资源文件操作示例
- XMLHTTP应用的一个实例
- 中国的IT,需要一个“人文”一点的氛围--有感于《开放API时代,把心思放在应用上》
- 无缝滚动实例--dedecms的一个应用
- C# Windows 桌面应用只运行一个实例(总结)
- 我觉得这样有点乱, 如果真的想搞下去,是否需要一个独立的网站?[乐色.Net]
- hiernate 中联合查询,得到的list是一个对象数组,这样需要进行适当处理来取值。
- Sphinx的一个应用实例
- 需要使用单一实例合需要应用单例模式的区别
- Create一个DataTable时需要创建这样一列,它的结果是根据一定的表达式自动生成的,DataColumn的Expression得属性
- 给出一个OpenGL扩展应用的实例
- ComponentOne WebChart的一个应用实例