以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  sql触发器中引用inse rted表出错  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=117845)

--  作者:happyft
--  发布时间:2018/4/19 20:19:00
--  sql触发器中引用inse rted表出错
下面的代码是sql数据库"仓库"表的update触发器语句,目的就是仓库表中的仓库名称变更时更新所有有仓库字段的表中的仓库名称
通过游标遍历每一个有仓库字体的表然后用动态sql语句更新仓库名称

代码写在这里总出错不能上传,只好用附件上传了

谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:触发器代码.txt

执行后显示错误
对象名 \'inserted\' 无效。
请教引用inserted表那里要怎么写?

--  作者:有点甜
--  发布时间:2018/4/19 20:29:00
--  

不能用这种方式处理 EXEC sp_executesql @sql;

 

这个时候无法再访问inserted表数据。

 

请尽量直接执行sql语句,或者把inserted表格数据存放到临时表(如 SELECT * INTO #inserted FROM INSERTED )

[此贴子已经被作者于2018/4/19 20:29:33编辑过]

--  作者:HappyFt
--  发布时间:2018/4/19 20:52:00
--  
按老师说的先将inserted存入临时表就可以了,谢谢
另外想请教一下,我的项目中有很多类似的运用,如产品编码表的产品编码变更时更新所有数据库表中有产品编码字段的表中的相应值
我目前只知道先查出有产品编码字段的表,然后用游标遍历表名用动态sql语句每个表更新,这种方法是不是很不好?
请教老师还有其他方法吗?你说的尽量直接执行SQL语句这种需求要怎么实现呢? 讲讲思路也行.
谢谢!

--  作者:有点甜
--  发布时间:2018/4/19 21:01:00
--  

1、我说的直接执行sql语句,意思是直接执行update语句,而不是试用exec的方式执行;

 

2、目前只能使用你现在的方式处理,也没有别的方法。


--  作者:HappyFt
--  发布时间:2018/4/19 21:13:00
--  
但如果不用动态sql,这种表名是变量的sql语句怎么写都不正确就像下面这样
 UPDATE \' + @tbname +\'
            SE T 仓库 = a.仓库名称
            FROM inserted a
                INNER JOIN Deleted b
                    ON a._Identify = b._Identify
            WHERE 仓库 = b.仓库名称;

总是了错
update后面表名是变量即红色那里用普通sql语句要怎么写呢?

--  作者:有点甜
--  发布时间:2018/4/19 21:19:00
--  

你目前的这种情况,不行,无法直接写,必须拼凑sql字符串再执行。