sql触发器报错

xiaoliuvv 2018-07-19 07:12:01
用户更新一个表的数据,我就根据更新这条数据的某个字段值去更新其他数据库
CREATE trigger [dbo].[wdzh_update]
on [dbo].[wdzh]
after update
as
declare @catid smallint /** 从属应用id **/
declare @tid bigint /** 应用内的表的唯一id **/
declare @zhzt smallint
declare @zhpage smallint
select @catid =wdzh_cat, @tid=wdzh_reid, @zhzt=wdzh_state, @zhpage=wdzh_pages from inserted
begin
case @catid
when 1 then /** 平台1 **/
update pt1.dbo.wdgl set wdgl_pages=@zhpage , wdgl_zhzt=@zhzt where wdgl_id = @tid
when 2 then /** 平台1 **/
update pt2.dbo.wdgl set wdgl_pages=@zhpage , wdgl_zhzt=@zhzt where wdgl_id = @tid
end case
end
对触发器不熟悉,这样写哪错了?
...全文
415 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2018-07-25
  • 打赏
  • 举报
回复
引用 6 楼 xiaoliuvv 的回复:
我有一个应用程序,做批量转换文档的,定时扫描数据库的一张表wdzh,表里有要转换的数据,就进行转换,并更新某个标识,代表转换过了,可以定时1分钟扫描一次,这个表里的记录是其他好多办公模块写过来的数据,都是其他模块需要转换文件的时候就插一条记录放在这个表里,通过wdzh_cat进行区别是哪个模块,我想在这个表一旦转换完成的时候通过wdzh_cat 判断是哪个应用,然后通过sql语句去更新相应办公模块的数据库表,这种应该用数据库的什么?? 我只想到了触发器,是我用错了吗?应该用什么方法? 下面是我的数据库表设计 wdzh表 wdzh_cat是数字,每个数字代表了相应的oa模块 wdzh_state表示转换完成状态,一旦被更新,判断是否为1(代表转换成功)如果是1,就更新wdzh_cat对应模块的数据库表
如果是1分钟扫描一次,那你可以先把处理写成存储过程,然后通过定时作业去调用执行存储过程,作业设置成1分钟运行1次。
二月十六 版主 2018-07-25
  • 打赏
  • 举报
回复
引用 6 楼 xiaoliuvv 的回复:
我有一个应用程序,做批量转换文档的,定时扫描数据库的一张表wdzh,表里有要转换的数据,就进行转换,并更新某个标识,代表转换过了,可以定时1分钟扫描一次,这个表里的记录是其他好多办公模块写过来的数据,都是其他模块需要转换文件的时候就插一条记录放在这个表里,通过wdzh_cat进行区别是哪个模块,我想在这个表一旦转换完成的时候通过wdzh_cat 判断是哪个应用,然后通过sql语句去更新相应办公模块的数据库表,这种应该用数据库的什么?? 我只想到了触发器,是我用错了吗?应该用什么方法?
下面是我的数据库表设计
wdzh表 wdzh_cat是数字,每个数字代表了相应的oa模块 wdzh_state表示转换完成状态,一旦被更新,判断是否为1(代表转换成功)如果是1,就更新wdzh_cat对应模块的数据库表


用触发器可以实现这个功能;用存储过程或者多次调用执行sql语句都行,控制好事务。
xiaoliuvv 2018-07-25
  • 打赏
  • 举报
回复
我有一个应用程序,做批量转换文档的,定时扫描数据库的一张表wdzh,表里有要转换的数据,就进行转换,并更新某个标识,代表转换过了,可以定时1分钟扫描一次,这个表里的记录是其他好多办公模块写过来的数据,都是其他模块需要转换文件的时候就插一条记录放在这个表里,通过wdzh_cat进行区别是哪个模块,我想在这个表一旦转换完成的时候通过wdzh_cat 判断是哪个应用,然后通过sql语句去更新相应办公模块的数据库表,这种应该用数据库的什么?? 我只想到了触发器,是我用错了吗?应该用什么方法?
下面是我的数据库表设计
wdzh表 wdzh_cat是数字,每个数字代表了相应的oa模块 wdzh_state表示转换完成状态,一旦被更新,判断是否为1(代表转换成功)如果是1,就更新wdzh_cat对应模块的数据库表
卖水果的net 版主 2018-07-20
  • 打赏
  • 举报
回复
case when 是用来返回值, if else ,是用来执行语句的。这个和高级语言还是有些区别的。
shinger126 2018-07-20
  • 打赏
  • 举报
回复
引用 楼主 xiaoliuvv 的回复:
用户更新一个表的数据,我就根据更新这条数据的某个字段值去更新其他数据库
CREATE trigger [dbo].[wdzh_update]
on [dbo].[wdzh]
after update
as
declare @catid smallint /** 从属应用id **/
declare @tid bigint /** 应用内的表的唯一id **/
declare @zhzt smallint
declare @zhpage smallint
select @catid =wdzh_cat, @tid=wdzh_reid, @zhzt=wdzh_state, @zhpage=wdzh_pages from inserted
begin
case @catid
when 1 then /** 平台1 **/
update pt1.dbo.wdgl set wdgl_pages=@zhpage , wdgl_zhzt=@zhzt where wdgl_id = @tid
when 2 then /** 平台1 **/
update pt2.dbo.wdgl set wdgl_pages=@zhpage , wdgl_zhzt=@zhzt where wdgl_id = @tid
end case
end
对触发器不熟悉,这样写哪错了?

触发器为什么这么写啊?批量插入的时候,如果wdzh_cat这些字段有不同的值,那么只有一种值能触发到的
二月十六 版主 2018-07-20
  • 打赏
  • 举报
回复
引用 2 楼 xiaoliuvv 的回复:
case when 难道不能用吗,if 我之前也用了,确实可以的,但catid会有很多,想着用case会清晰一点,是触发器不能这样用case吗?应该怎么用?

触发器中可以用case when,但是不是这样的用法,不是分支判断用的,是类似这样的
update a set b=(case when c=1 then 1 else 0  end)
xiaoliuvv 2018-07-20
  • 打赏
  • 举报
回复
case when 难道不能用吗,if 我之前也用了,确实可以的,但catid会有很多,想着用case会清晰一点,是触发器不能这样用case吗?应该怎么用?
二月十六 版主 2018-07-19
  • 打赏
  • 举报
回复
CREATE TRIGGER [dbo].[wdzh_update]
ON [dbo].[wdzh]
AFTER UPDATE
AS
DECLARE @catid SMALLINT; /** 从属应用id **/
DECLARE @tid BIGINT; /** 应用内的表的唯一id **/
DECLARE @zhzt SMALLINT;
DECLARE @zhpage SMALLINT;
SELECT @catid = wdzh_cat,
@tid = wdzh_reid,
@zhzt = wdzh_state,
@zhpage = wdzh_pages
FROM inserted;
IF @catid = 1
BEGIN
/** 平台1 **/
UPDATE pt1.dbo.wdgl
SET wdgl_pages = @zhpage,
wdgl_zhzt = @zhzt
WHERE wdgl_id = @tid;
END;
IF @catid = 2
BEGIN
UPDATE pt2.dbo.wdgl
SET wdgl_pages = @zhpage,
wdgl_zhzt = @zhzt
WHERE wdgl_id = @tid;
END;

34,590

社区成员

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

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