用触发器代替大批量sql语句处理功能

本文探讨了在投票系统中采用独立数据表记录用户选择的问题,并提出使用触发器实现数据自动分割的解决方案,以提高系统性能和数据处理效率。通过代码示例展示了如何创建触发器来解析用户输入的选项字符串,并将其拆分成独立的题目与选项记录。此外,还提供了检查和删除触发器的SQL代码,确保系统灵活性与维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      今天在做一个投票模块的时候遇到了一个问题,数据库的层次分为:项目表(1)-->题目表(n),题目表(1)-->选项表(n)。在设计实际投票表的时候,用于记录实际选择的题目与选项就需要采用独立的数据表来进行记录,及一个选项做为一条记录(这样方便项目的后期数据统计),然后如果用程序来处理的话,就每次用户在投票的时候就可能面临上百次的sql语句的处理过程,这对于程序的处理和数据的传输都是一种考验(并不是一种优秀的处理方案),因此想到先在投票表里面用一个字段记录实际选择的题目与选项(采用字符串拼接的方式),插入到数据表的时候采用触发器进行数据分割,用触发器来对拼接的字符串进行切割并插入到记录实际选择的题目与选项的独立表格中。

      实际应用的代码如下:

CREATE TRIGGER vote_data_insert_trigger ON vote_data FOR INSERT AS BEGIN declare @data varchar(50),@tmp_data varchar(50); declare @proId int,@dataId int; select @data=data,@proId=proId,@dataId=id from inserted set @tmp_data =@data; declare @index int; --获取,出现的首位置 set @index =charindex(',',@tmp_data); while @index>=0 begin declare @tmp_right varchar(20); --处理最后一个结果 if @index>0 begin set @tmp_right =Left(@tmp_data,@index-1); set @tmp_data = RIGHT(@tmp_data,len(@tmp_data)-@index); end else set @tmp_right=@tmp_data; declare @titleId int,@optionId int; set @titleId = left(@tmp_right,charindex('-',@tmp_right)-1); set @optionId=right(@tmp_right,len(@tmp_right)-charindex('-',@tmp_right)); insert into vote_data_detail values(@proId,@titleId,@optionId,@dataId); if @index=0 break; --获取,出现的首位置 set @index =charindex(',',@tmp_data); end END

 


 

插入投票表的sql类似如下进行处理:

 

insert into vote_data (proId,data) values (1,'1-1,1-2,1-4,1-3,2-1,2-2,2-3');

 


 

查看触发器是否存在,如果存在则进行删除的sql代码如下:

if exists(select name from sysobjects where name='vote_data_insert_trigger' AND type='TR') DROP TRIGGER vote_data_insert_trigger GO

 


 

查看触发器的sql代码如下:

exec sp_helptext vote_data_insert_trigger

 


 

知识点备注:

1、left()

left(<character_expression>,<integer_exception>)

返回character_exception左起integer_expression个字符

 

2、charindex()

返回字符串中某个指定的子串出现的开始位置。

charindex(<'substring_expression'>,<expression>)

其中substring_expression是所要查找的字符表达式,

expression可为字符串也可为列名表达式。如果没有发现子串,则返回0值。

此函数不能用于TEXT和IMAGE的数据类型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值