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 视图数据的增删改查教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • sqlserver数据库危险扩展删除和恢复代码

    sqlserver数据库危险扩展删除和恢复代码

    今天为了实现sqlserver的复制功能,因为以前删除了很多的sqlserver的一些会导致不安全因素的扩展,导致很多功能无法用,没有办法需要重新的恢复扩展。
    2010-07-07
  • MySql 安装时的1045错误

    MySql 安装时的1045错误

    MySql安装到最后一步的时候,出现1045的错误有两种解决办法。
    2009-07-07
  • 浅述SQL Server的聚焦强制索引查询条件和Columnstore Index

    浅述SQL Server的聚焦强制索引查询条件和Columnstore Index

    本文主要讲了强制使用索引条件来进行查询,当对于使用默认创建索引进行查询计划时觉得不是最优解,可以尝试使用强制索引来进行对比找出更好得解决方案。简短的内容,深入的理解.有兴趣的朋友可以看下
    2016-12-12
  • 一个删选数据的例子,使用GROUP、DISTINCT实例解析

    一个删选数据的例子,使用GROUP、DISTINCT实例解析

    今天遇到的问题,纠结了一上午,终于解决了。在此记录下来,自我认为还有很多类似的问题都可以套用这段代码
    2013-09-09
  • sql动态行转列的两种方法

    sql动态行转列的两种方法

    sql动态行转列的两种方法,需要的朋友可以参考一下
    2013-04-04
  • SQL 窗口函示例数详解

    SQL 窗口函示例数详解

    窗口函数(Window Function),也叫OLAP函数(Online Anallytical Processing,联机分析处理)或者分析函数(Analytic Function),可以对数据库数据进行实时分析处理,这篇文章主要介绍了SQL 窗口函数详解,需要的朋友可以参考下
    2024-06-06
  • SQLSERVER如何查看索引缺失及DMV使用介绍

    SQLSERVER如何查看索引缺失及DMV使用介绍

    当我们发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能,在短时间之内找到一个优化的索引组合对人脑来讲,不是一件简单的事啊,所以有了本文的出现,感兴趣的你可不要错过了哈
    2013-02-02
  • SQL语句中的ON DUPLICATE KEY UPDATE使用

    SQL语句中的ON DUPLICATE KEY UPDATE使用

    本文主要介绍了SQL语句中的ON DUPLICATE KEY UPDATE使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • SQL提取数据库表名及字段名等信息代码示例

    SQL提取数据库表名及字段名等信息代码示例

    这篇文章主要介绍了SQL提取数据库表名及字段名等信息的方法,文中向大家分享了实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10

最新评论