请教个触发器的写法

egsoftcc 2011-06-16 11:44:59
各位好,我想请教这个问题能否用触发器实现?如果能,麻烦费心写一下语句,谢谢。

表1 客户资料
客户编号 用户名 短信数量
1 user 1000
2 user2 2000

表2 临时发送表

id 用户名 手机 内容
1 user 135111,136111,137. 这个是短信内容

表3 发送表

id 用户名 手机 内容
1 user 135111 这个是短信内容
2 user 136111 这个是短信内容
3 user 137. 这个是短信内容

说明一下,客户资料存储客户的信息,包括剩余的短信数量
发送的手机短信先插入临时发送表,其中手机是用逗号分割的无数个手机号码
我的目的是加入临时发送表后,创建个触发器,首先判断手机号码有多少个,内容有没有超过60个字,超过60个字算多条短信,这样减去客户资料里的短信数量
手机个数*短信条数,如果不为负数,表示余额足够发送,则加入到表 发送表中,其中的手机不要用逗号分割了,一个号码一条,其他不变。
...全文
80 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogodiy 2011-06-17
  • 打赏
  • 举报
回复
学习了
--小F-- 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qianjin036a 的回复:]
SQL code
create table usertb(uid int,uname varchar(10),ct int)
insert into usertb select 1,'user',1000 union all select 2,'user2',2000
create table sendtb(id int identity(1,1),uname varchar(10),mob……
[/Quote]

膜拜死了
-晴天 2011-06-16
  • 打赏
  • 举报
回复
建议:
1.不要用触发器,因为触发器的效率不高,而且如果访问量大可能会出问题.
2.用存储过程.触发器能完成的,存储过程完全可以,你可以把临时发送表中的信息作为变量传给存储过程,由存储过程处理,得出发送表.
3.存储过程如上.
-晴天 2011-06-16
  • 打赏
  • 举报
回复
create table usertb(uid int,uname varchar(10),ct int)
insert into usertb select 1,'user',1000 union all select 2,'user2',2000
create table sendtb(id int identity(1,1),uname varchar(10),mobilecode varchar(11),cont nvarchar(1000))
go
create procedure getsendlist
(
@uname varchar(10),@codelist varchar(1000),@msg nvarchar(1000)
)
as
begin
declare @n int
--一条信息的短信数
set @n=len(@msg)/60+sign(len(@msg)%60)
SET NOCOUNT OFF
;with c1 as(
select number,substring(@codelist,number,charindex(',',@codelist+',',number+1)-number)code from master..spt_values
where type='p' and number<=len(@codelist) and substring(@codelist,number,1)<>',' and substring(','+@codelist,number,1)=','
),c2 as(
select row_number()over(order by number)*@n rn,code from c1
)insert into sendtb select @uname,code,@msg from c2 where rn<=(select ct from usertb where uname=@uname)
update usertb set ct=ct-@@rowcount*@n where uname=@uname
end
go
exec getsendlist 'user','135111,136111,137.','我的目的是加入临时发送表后,创建个触发器,首先判断手机号码有多少个,内容有没有超过60个字,超过60个字算多条短信,这样减去客户资料里的短'
select * from sendtb
select * from usertb
/*
id uname mobilecode cont
----------- ---------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 user 135111 我的目的是加入临时发送表后,创建个触发器,首先判断手机号码有多少个,内容有没有超过60个字,超过60个字算多条短信,这样减去客户资料里的短
2 user 136111 我的目的是加入临时发送表后,创建个触发器,首先判断手机号码有多少个,内容有没有超过60个字,超过60个字算多条短信,这样减去客户资料里的短
3 user 137. 我的目的是加入临时发送表后,创建个触发器,首先判断手机号码有多少个,内容有没有超过60个字,超过60个字算多条短信,这样减去客户资料里的短

(3 行受影响)

uid uname ct
----------- ---------- -----------
1 user 994
2 user2 2000

(2 行受影响)

*/
go
drop table usertb,sendtb
GoAwayZ 2011-06-16
  • 打赏
  • 举报
回复
不要用触发器,整体用存储过程,写在一个事务里处理。
egsoftcc 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qianjin036a 的回复:]
SQL code

create table usertb(uid int,uname varchar(10),ct int)
insert into usertb select 1,'user',1000 union all select 2,'user2',2000
create table sendtb(id int identity(1,1),uname varchar(10),m……
[/Quote]
非常感谢,我明天试一下

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧