EXEC(EXECUTE)函数访问INSERTED或DELETED的内部临时触发表
宇智波鼬异界之旅,免费邮箱126,常红刚
刚开始时,这个表的字段很少(10个以内),前开发者把这个表的所有存储过程与触发器以及表函数全是写死了。用户每添加一些字段,都需要手动去更改这些存储过程与触发器以及表函数。现在这个表的字段已经高达300个以上,有可能还会增长,因此insus.net的业务就是把这此静态全改写为动态处理。
然而有一个问题一直困拢至昨天,昨天是星期天本应是休息的,但是这个问题没有解决,因此这天算不上休息了。
问题就是改写表的触发器,涉及到exec(execute)函数访问inserted或deleted的内部临时触发表,如:
execute('select '+ @n +' = isnull(['+ @i +'],0) from inserted')
当你尝试执行上面的sql语句,会得到一个异常提示:invalid object name 'inserted'。我们无法显示访问inserted或deleted的内部临时触发表。
由于inserted或是deleted表是动态驻留在内存中,而不是存储在数据库中,它不是显式的。触发器的执行是在导致触发器被触发的执行计划中。当我们使用exec(execute)或sp_executesql执行动态生成的sql语句时,它却是另外一个单独的执行计划。两者之间的资源无法相互访问,再加上计划执行完毕,内存也随之释放资源了。
但是问题还是需要解决,insus.net想起的还是临时表。可以把inserted或deleted表中的数据,首先转换入临时表了。这样子,我们就可以对临时表的数据进行处理了。
select * into #inserted from inserted
select * into #deleted from deleted
实现代码:
declare @f nvarchar(max) = convert(nvarchar(max),@i) --@i动态字段
execute ('select ['+ @f +'] from #deleted)
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!!
点击进行留言回复
相关文章:
-
-
sql某个日期是当年的第几周
/* *周一作为一周的开始 *当年的1月1号所在的周算作第一周 */ CREATE function GetWeekIndexFirstDate ( @...
[阅读全文]
-
-
数据库SQL---范式
1、数据冗余导致的问题:冗余存储、更新异常、插入异常、删除异常。 2、函数依赖:一种完整性约束。 在关系模式r(R)中,α属于R,β属于R。 1)α函数...
[阅读全文]
-
-
数据库SQL---查询
1、查询所有列 select *from emp;--*表示所有的,from emp表示从emp表中查询。 2、查询指定列 select empno,e...
[阅读全文]
-
-
-
-
-
网友评论