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

 更新时间:2012年01月20日 21:32:08   作者:  
近段时间,MS SQL方面,一直需要开发动态方面的存储过程或是触发器以及表函数。因为程序设计一开始就是让用户动态添或是删除一个表的字段,然而这个表的相关存储过程或是触发器以及为报表准备的表函数也会随之这个表的字段变化而变化
刚开始时,这个表的字段很少(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 server不存在 sql server拒绝访问

    sql server不存在 sql server拒绝访问

    总出现“SQL Server不存在或访问被拒绝”。1,SQL Server名称或IP地址拼写有误 2,服务器端网络配置有误3,客户端网络配置有误
    2007-12-12
  • SQL语句删除2条重复数据一条保留一条

    SQL语句删除2条重复数据一条保留一条

    SQL语句2条完全一样的数据删除一条保留一条,SQL Server 2005 Express 下测试通过, 仅供参考
    2012-06-06
  • sqlserver 使用SSMS运行sql脚本的六种方法

    sqlserver 使用SSMS运行sql脚本的六种方法

    这篇文章主要介绍了sqlserver 使用SSMS运行sql脚本的六种方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 教你如何看懂SQL Server查询计划

    教你如何看懂SQL Server查询计划

    本文只谈优化查询时如何看懂SQL Server查询计划。毕竟我对SQL Server的认识有限,如有错误,也恳请您在发现后及时批评指正。 当然如果能对大家有所帮助,也不枉我写这么多文字了
    2014-08-08
  • 解决SqlServer 各版本 sa帐户不能登录问题

    解决SqlServer 各版本 sa帐户不能登录问题

    我们在使用SqlServer的时候,经常会遇到sa账号不能登录的问题,那么我们怎么来处理这个问题呢,分享下个人的思路及方法
    2014-08-08
  • 实例详解Group by和Having子句

    实例详解Group by和Having子句

    这篇文章主要介绍了实例详解Group by和Having子句的相关资料,需要的朋友可以参考下
    2016-01-01
  • SQL Server并发处理存在就更新解决方案探讨

    SQL Server并发处理存在就更新解决方案探讨

    这篇文章主要和大家一起探讨了SQL Server并发处理存在就更新的7种解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • SQLServer 数据库开发顶级技巧

    SQLServer 数据库开发顶级技巧

    无论你的专业水平如何,从其他IT专家那里学习新的技巧与最佳实践常常都是有益的。本文包含了我遇到过的SQL Server开发的高级技巧。希望其中的一些技巧能够对您的数据库开发及管理工作有所帮助。
    2009-07-07
  • 如何在SQL Server 2014中用资源调控器压制你的存储?

    如何在SQL Server 2014中用资源调控器压制你的存储?

    本文通过一个非常简单的例子介绍了如何利用SQL Server 2014中的资源调控器(Resource Governor)来压制你的存储,需要的朋友可以参考下
    2015-07-07
  • 我也有微信朋友圈了 Android实现

    我也有微信朋友圈了 Android实现

    最近写了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照或者从相册选取,从相册选取可以一次选择多张照片,并且限制照片的张数,想拥有真正属于自己的朋友圈吗?快来围观
    2016-05-05

最新评论