求一个触发语句

小豆好好 2009-03-05 09:21:11
A表
------------------------------------------------
ID name date
1 张3 AAA/ID33
2 LI4 BBB/ID1
------------------------------------------------
B表
------------------------------------------------
ID name
1 AAA
2 BBB
3 CCC
---------------------------------------------------
C表
---------------------------------------------------
ID BID space AID
1 1 33 1
2 2 1 2
-----------------------------------------------------
在A表中添加一条记录时,根据A表的[date]值,及B表相关信息,更新C表
如A添加
张5 CCC/ID3 时,我希望更新C表(C表中相应信息都有,只是AID为空,需更新。)
---------------------------------------------------
ID BID space AID
1 1 33 1
2 2 1 2
3 3 3 3
-----------------------------------------------------
...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdhdy 2009-03-08
  • 打赏
  • 举报
回复
--先给你一个字符串分割函数
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
go
--如你要分解的字符串是'AAA/ID3,BBB/ID4,CCC/ID3 '
select * from dbo.f_splitstr('AAA/ID3,BBB/ID4,CCC/ID3',',')
/*
F1
----------------------------------------------------------------------------------------------------
AAA/ID3
BBB/ID4
CCC/ID3

(所影响的行数为 3 行)
*/
go
create trigger trig_a_insert on a
for insert,update
as
declare @str varchar(100),@str1 varchar(100)
select @str=(select date from inserted),@str1=(select date from deleted)

--根据更新前的date,更新状态为1

update 表c set 状态=1 from (select f1 from dbo.f_splitstr(@str1,',')) d,b
where left(d.f1,charindex('/',d.f1)-1)=b.name and b.id=c.id

--然后在根据更新的列【date】,将C表的【AID】更新:
update 表c set aid=right(d.f1,len(d.f1)-charindex('/id',d.f1)-2) from (select f1 from dbo.f_splitstr(@str,',')) d,b
where left(d.f1,charindex('/',d.f1)-1)=b.name and b.id=c.id

--为什么要分成两次更新呢?而不合成一个:
--如下:
/*
update 表c set aid=right(d.f1,len(d.f1)-charindex('/id',d.f1)-2),状态=1 from (select f1 from dbo.f_splitstr(@str,',')) d,b
where left(d.f1,charindex('/',d.f1)-1)=b.name and b.id=c.id
*/


sdhdy 2009-03-08
  • 打赏
  • 举报
回复
--先给你一个字符串分割函数
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
go
--如你要分解的字符串是'AAA/ID3,BBB/ID4,CCC/ID3 '
select * from dbo.f_splitstr('AAA/ID3,BBB/ID4,CCC/ID3',',')
/*
F1
----------------------------------------------------------------------------------------------------
AAA/ID3
BBB/ID4
CCC/ID3

(所影响的行数为 3 行)
*/
go
create trigger trig_a_insert on a
for insert,update
as
declare @str varchar(100),@str1 varchar(100)
select @str=(select date from inserted),@str1=(select date from deleted)

--根据更新前的date,更新状态为1

update 表c set 状态=1 from (select f1 from dbo.f_splitstr(@str1,',')) d,b
where left(d.f1,charindex('/',d.f1)-1)=b.name and b.id=c.id

--然后在根据更新的列【date】,将C表的【AID】更新:
update 表c set aid=right(d.f1,len(d.f1)-charindex('/id',d.f1)-2) from (select f1 from dbo.f_splitstr(@str,',')) d,b
where left(d.f1,charindex('/',d.f1)-1)=b.name and b.id=c.id

--为什么要分成两次更新呢?而不合成一个:
--如下:
/*
update 表c set aid=right(d.f1,len(d.f1)-charindex('/id',d.f1)-2),状态=1 from (select f1 from dbo.f_splitstr(@str,',')) d,b
where left(d.f1,charindex('/',d.f1)-1)=b.name and b.id=c.id
*/


小豆好好 2009-03-06
  • 打赏
  • 举报
回复
应该需要一个字符串分解函数。
小豆好好 2009-03-06
  • 打赏
  • 举报
回复
哦,我才发现我写的还是不全,实际[date]是一系列字符串如 AAA/ID3,BBB/ID4,CCC/ID3
将它使用“,”分解得到[AAA/ID3],[BBB/ID4],[CCC/ID3],然后再分别对得到的这些再分解根据“/ID”得到【AAA],[3];[BBB],[4];[CCC],[3];
得到这些数据后,分别更新C表相应的【AID 】值

另:如果我在C表中再添加一列【状态】,默认为0
我想如果表A更新时,在更新前根据原有的列【date】,将C表中相应记录的【状态】,更新为1
然后在根据更新的列【date】,将C表的【AID】更新:
帮我将这种情况也考虑一下。
小豆好好 2009-03-06
  • 打赏
  • 举报
回复
哦,我才发现我写的还是不全,实际[date]是一系列字符串如 AAA/ID3,BBB/ID4,CCC/ID3
将它使用“,”分解得到[AAA/ID3],[BBB/ID4],[CCC/ID3],然后再分别对得到的这些再分解根据“/ID”得到【AAA],[3];[BBB],[4];[CCC],[3];
得到这些数据后,分别更新C表相应的【AID 】值

另:如果我在C表中再添加一列【状态】,默认为0
我想如果表A更新时,在更新前根据原有的列【date】,将C表中相应记录的【状态】,更新为1
然后在根据更新的列【date】,将C表的【AID】更新:
帮我将这种情况也考虑一下。
sdhdy 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iwaly 的回复:]
可能我没有说清楚,不好意思!
我想要的效果是:
当表A添加一条数据生成后如下:
----------------------
ID name date
3 张5 CCC/ID3
----------------------
自动将[CCC/ID3]分解为[CCC]、[3]
【CCC】对照表B得到ID为3,结合上面得到的[3],与表A添加后生成的ID3,向表C更新记录(C表中原存在记录,如这次的记录:BID为3 space为3 AID为空的记录 )

自动编号 B表ID 通道(如这次得到的3) A表…
[/Quote]

先说自动将[CCC/ID3]分解为[CCC]、[3] ,后面这个3怎么得到的?
小豆好好 2009-03-06
  • 打赏
  • 举报
回复
可能我没有说清楚,不好意思!
我想要的效果是:
当表A添加一条数据生成后如下:
----------------------
ID name date
3 张5 CCC/ID3
----------------------
自动将[CCC/ID3]分解为[CCC]、[3]
【CCC】对照表B得到ID为3,结合上面得到的[3],与表A添加后生成的ID3,向表C更新记录(C表中原存在记录,如这次的记录:BID为3 space为3 AID为空的记录 )

自动编号 B表ID 通道(如这次得到的3) A表ID
--------------------------------------------------
ID BID space AID
3 3 3 3
求这个触发器中。

另:如果我在C表中再添加一列【状态】,默认为0
我想如果表A更新时,
在更新前根据原有的列【date】,将C表中相应记录的【状态】,更新为1
然后在根据更新的列【date】,将C表的【AID】更新:这样的话,触发句应怎么填写。



dawugui 2009-03-05
  • 打赏
  • 举报
回复
create trigger my_trig on a
for insert
as
update C set aid = '...' from c , b , inserted t where t.date like '%' + b.name + '%' and b.id = c.bid
sdhdy 2009-03-05
  • 打赏
  • 举报
回复
create trigger trig_insert_a on a
for insert
as
update C表 set aid=你要更新的值 from inserted a where a.id=c.id
sdhdy 2009-03-05
  • 打赏
  • 举报
回复
根据什么规则更新AID ?
sdhdy 2009-03-05
  • 打赏
  • 举报
回复
根据什么规则更新AID ?

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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