今天在做一个投票模块的时候遇到了一个问题,数据库的层次分为:项目表(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的数据类型