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

刚开始时,这个表的字段很少(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)

(0)

相关推荐

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

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

  • 全面解析JS字符串和正则表达式中的match、replace、exec等函数

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 正则表达式由于不经常使用,所以容易经常忘记,下面小编把常用的函数和功能,简明扼要的罗列在此,以备日后查看: RegExp对象的函数常用的有2个 1.test函数 用法:RegExpObject.test(string) 返回:如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回

  • C++中静态成员函数访问非静态成员的实例

    C++中静态成员函数访问非静态成员的实例 实现代码: #include <iostream> /* 静态成员函数只能访问静态数据成员.静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可的函数访问.原因是:当前对象的地址(this)是被隐含地传递到被调用的函数的.但一个静态成员函数没有this指针,所以它无法访问非静态的成员函数. */ class a { public: static void FunctionA()//静态成员函数没有隐含的

  • Android4.4新增函数访问外部存储

    在Android 4.4系统中,外置存储卡(SD卡)被称为二级外部存储设备(secondary storage),应用程序已无法往外置存储卡(SD卡)写入数据,并且WRITE_EXTERNAL_STORAGE只为设备上的主要外部存储(primary storage)授予写权限,对于其他外部存储,其上的文件属性都改为基于文件夹结构,应用无需获取WRITE_EXTERNAL_STORAGE权限,但可以管理与自己包名相关的文件夹. 举例来说,如果应用的包名是com.example.externalst

  • JavaScript中子函数访问外部变量的3种解决方法

    前言 我们在写web页面时,肯定会经常遇到下面这种情况: <body> <div class="btns-wrapper"></div> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> var wrapper = $('.btns-wrapper'); fo

  • JavaScript闭包函数访问外部变量的方法

    闭包是指有权访问另一个函数作用域中的变量的函数,但作用域的配置机制有一个需要注意的地方,即闭包只能取得包含函数中任何变量的最后一个值. 如以下案例: function create(){     var arr = new Array();        for (var i=0; i<10; i++){         arr[i] = function(){             return i;         };      }       return arr; }   var c

  • PHP中通过fopen()函数访问远程文件示例

    使用PHP不仅可以让用户通过浏览器访问服务器端的文件,还可以通过HTTP或FTP等协议访问其他服务器中的文件,可以在大多数需要用文件名作为参数的函数中使用HTTP和FTP URL来代替文件名.使用fopen()函数将指定的文件名与资源绑定到一个流上,如果文件名是"scheme://-"的格式,则被当成一个URL,PHP将搜索协议处理器(也被成为封装协议)来处理此模式. 如果需要远程访问文件,必须在PHP的配置文件中激活"allow_url_fopen"选项,才能使用

  • 关于C++静态成员函数访问非静态成员变量的问题

    复制代码 代码如下: class a{public:  static FunctionA()  {     menber = 1;  } private:  int menber;} 编译上述代码,出错.原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存.静态成员函数没有隐含的this自变量.所以,它就无法访问自己类的非静态成员. 那要想访问怎么办呢?地球人都知道只要将: 复制代码 代码如下: int me

  • 解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题

    在IE与google chrome中则一切正常,很是郁闷,找了很多种调用iframe中函数的方法,问题一直没有解决.今天在google上又搜索了一下,耐心的浏览搜索结果,最后发现有人写到可以用 document.getElementById('iframeid').contentWindow.myFunc(); 这样的方式,以前没有看到过这种写法,抱着死马当活马医的心态,试了一下这段代码.奇迹发生了,药到病除.现在这种方法在前面提到的三种浏览器中都能正常的工作,在这里做下笔记,以备后用.

  • 判断字段是否被更新 新旧数据写入Audit Log表中

    Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段. 还要创建另外一个表[Audit],就是存储跟踪记录的表: 复制代码 代码如下: Audit SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Audit]( [Audit_nbr] [int] IDENTITY(1,1) NOT NULL, [AuditTy

随机推荐