微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EXEC(EXECUTE)函数访问INSERTED或DELETED的内部临时触发表

刚开始时,这个表的字段很少(10个以内),前开发者把这个表的所有存储过程与触发器以及表函数全是写死了。用户添加一些字段,都需要手动去更改这些存储过程与触发器以及表函数。现在这个表的字段已经高达300个以上,有可能还会增长,因此Insus.NET的业务就是把这此静态全改写为动态处理。 然而有一个问题一直困拢至昨天,昨天是星期天本应是休息的,但是这个问题没有解决,因此这天算不上休息了。 问题就是改写表的触发器,涉及到EXEC(EXECUTE)函数访问INSERTED或DELETED的内部临时触发表,如:
<div class="codetitle"><a style="CURSOR: pointer" data="42422" class="copybut" id="copybut42422" onclick="doCopy('code42422')"> 代码如下:

<div class="codebody" id="code42422">
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表中的数据,首先转换入临时表了。这样子,我们就可以对临时表的数据进行处理了。 <div class="codetitle"><a style="CURSOR: pointer" data="34136" class="copybut" id="copybut34136" onclick="doCopy('code34136')"> 代码如下:
<div class="codebody" id="code34136">
SELECT INTO #inserted FROM INSERTED
SELeCT
INTO #deleted FROM DELETED

实现代码: <div class="codetitle"><a style="CURSOR: pointer" data="12109" class="copybut" id="copybut12109" onclick="doCopy('code12109')"> 代码如下:
<div class="codebody" id="code12109">
DECLARE @F NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX),@I) --@I动态字段
EXECUTE ('SELECT ['+ @F +'] FROM #deleted)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐