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

2014-12-10  来源:本站原创  分类:MsSql  人气:1 

近段时间,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) [email protected]动态字段
EXECUTE ('SELECT ['+ @F +'] FROM #deleted)
相关文章
  • EXEC(EXECUTE)函数访问INSERTED或DELETED的内部临时触发表 2014-12-10

    近段时间,MS SQL方面,一直需要开发动态方面的存储过程或是触发器以及表函数.因为程序设计一开始就是让用户动态添或是删除一个表的字段,然而这个表的相关存储过程或是触发器以及为报表准备的表函数也会随之这个表的字段变化而变化 刚开始时,这个表的字段很少(10个以内),前开发者把这个表的所有存储过程与触发器以及表函数全是写死了.用户每添加一些字段,都需要手动去更改这些存储过程与触发器以及表函数.现在这个表的字段已经高达300个以上,有可能还会增长,因此Insus.NET的业务就是把这此静态全改写为动

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

    这篇文章主要介绍了PHP中通过fopen()函数访问远程文件示例,本文讲解了fopen函数的作用.使用它需要的配置问题.超时问题等内容,并给出了代码实例,需要的朋友可以参考下 使用PHP不仅可以让用户通过浏览器访问服务器端的文件,还可以通过HTTP或FTP等协议访问其他服务器中的文件,可以在大多数需要用文件名作为参数的函数中使用HTTP和FTP URL来代替文件名.使用fopen()函数将指定的文件名与资源绑定到一个流上,如果文件名是"scheme://-"的格式,则被当成一个URL,

  • JavaScript闭包函数访问外部变量的方法 2015-02-09

    这篇文章主要介绍了JavaScript闭包函数访问外部变量的方法,本文使用匿名函数来实现在闭包中访问外部变量,需要的朋友可以参考下 闭包是指有权访问另一个函数作用域中的变量的函数,但作用域的配置机制有一个需要注意的地方,即闭包只能取得包含函数中任何变量的最后一个值. 如以下案例: function create(){ var arr = new Array(); for (var i=0; i<10; i++){ arr[i] = function(){ return i; }; } retur

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

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

  • PHP启动windows应用程序.执行bat批处理.执行cmd命令的方法(exec.system函数详解) 2015-01-15

    这篇文章主要介绍了PHP启动windows应用程序.执行bat批处理.执行cmd命令的方法(exec.system函数详解),需要的朋友可以参考下 exec 或者 system 都可以调用cmd 的命令 直接上代码: <?php /** 打开windows的计算器 */ exec('start C:WindowsSystem32calc.exe'); /** php生成windows的批处理文件后,再执行这个批处理文件*/ $filename = 't.bat'; $somecontent =

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

    最近做ext时遇到一个问题,在firefox中浏览ext应用,加载后第一次打开一个嵌入iframe的Window时,可以直接通过js代码来执行 iframe中的js函数,但是如果将窗口关闭后重新再打开,将会抛出异常,说是funcName is not a function 在IE与google chrome中则一切正常,很是郁闷,找了很多种调用iframe中函数的方法,问题一直没有解决.今天在google上又搜索了一下,耐心的浏览搜索结果,最后发现有人写到可以用 document.getElem

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

    客户要求,要对一个敏感数据表进行Audit跟踪.如果记录被更新时,要把旧新保存起来,是谁更改了记录,什么时候更新的等相关信息.还有一个主要问题就是客户不确定具体要跟踪那个字段,希望自己决定 Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段. 还要创建另外一个表[Audit],就是存储跟踪记录的表: Audit SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING

  • 判断触发器正在处理的是插入,删除还是更新触发 2014-05-17

    平常时写触发器(TRIGGER),一般会分别写插入(INSERT),删除(DELETE)和更新(UPDATE)单独的触发器 但是有时候,可以视看处进逻辑程度,可以把三者写成一个触发器,只是在其中稍作判断而已. 你可以根据从下面方法判断触发器是是处理了插入,删除还是更新触发的: --宣告两个变量 DECLARE @D BIT = 0 DECLARE @I BIT = 0 --如果在DELETED内部临时触发表找到记录,说明旧数据被删除 IF EXISTS(SELECT TOP 1 1 FROM D

  • SQL SERVER中各类触发器的完整语法及参数说明 2015-03-14

    这篇文章主要介绍了SQL SERVER中各类触发器的完整语法及参数,需要的朋友可以收藏下 语法: Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTE

  • this和执行上下文实现代码 2014-04-25

    Javascript中this关键字通常指向当前函数的拥有者.在javascript中通常把这个拥有者叫做执行上下文. 函数的执行上下文由当前的运行环境而定: 1. 全局变量和全局函数附属于全局对象(window),因此使用"var"或"this"两种方法定义全局变量是等效的. 2. 执行上下文和作用域不同.执行上下文在运行时确定,随时可能改变,而作用域则在定义时确定,永远不会变. 3. 如果当前执行的是一个对象的方法,则执行上下文就是这个方法所附属的对象. 4.

  • php访问数组最后一个元素的函数end()用法 2015-02-17

    这篇文章主要介绍了php访问数组最后一个元素的函数end()用法,实例分析了php中end函数访问数组元素的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了php访问数组最后一个元素的函数end()用法.分享给大家供大家参考.具体分析如下: end()函数在PHP中用于检索数组中的最后一个元素.end()函数需要一个数组作为其唯一参数,并返回给定数组最后一个元素的元素值. $users = array ("baidu.com", "haosou.com"

  • sql server TRIGGER and logic and DELETED tables INSTERED 2011-03-21

    About the content collection on internet Trigger statements used two special tables: deleted table and the inserted table. Microsoft SQL Server automatically creates and manages these tables. You can use these temporary in-memory tables to test the e

  • 高性能Javascript--高效的数据访问 2014-07-19

    接上一篇,希望能写一个高性能Javascript专题. 第一篇:高性能Javascript--脚本的无阻塞加载策略. 经典计算机科学的一个问题是,数据应当存放在什么地方,以实现最佳的读写效率.数据存储是否得当,关系到代码运行期间数据被检索到的速度.在Javascript中,此问题相对简单,因为数据表现方式只有少量方式可供选择.在Javascript中,有四种基本的数据访问位置: Literal values 直接量 直接量仅仅代表自己,而不存储于特定的位置. Javascript的直接量包括:字

  • java sqlserver2005 "can not get value from the deleted line" solution 2010-04-13

    java sqlserver2005 "can not get value from the deleted line" solution Most began to experience this problem, been looking for other reasons, use join, join the right table for no data. Behind the test results of a simple sql statement, no proble

  • Lua中的函数知识总结 2013-10-19

    这篇文章主要介绍了Lua中的函数知识总结,本文讲解了函数的一些基础知识.多重返回值问题.变长参数.内嵌函数等内容,需要的朋友可以参考下 前言 Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数放在一对圆括号中,即使调用函数时没有参数,也必须写出一对空括号.对于这个规则只有一种特殊的例外情况:一个函数若只有一个参数,并且此参数是一个字符串或table构造式,那

  • javascript some()函数用法详解 2014-09-07

    文章主要详细介绍了some函数的用法,非常的实用,有需要的小伙伴们可以参考下. 参数说明 callback: 要对每个数组元素执行的回调函数. thisObject : 在执行回调函数时定义的this对象. 功能说明 对数组中的每个元素都执行一次指定的函数(callback),直到此函数返回 true,如果发现这个元素,some 将返回 true,如果回调函数对每个元素执行后都返回 false ,some 将返回 false.它只对数组中的非空元素执行指定的函数,没有赋值或者已经删除的元素将被忽

  • 关于回调函数和this指针探讨 2014-09-18

    在C里面,经常需要提供一个函数地址,注册到结构里,然后在程序执行到特定阶段时,回调该函数.创建线程,注册线程运行的主函数就是一个典型的例子.这里以简单的回调实例,说明C++中回调函数为成员函数时有关this指针的问题.由于C++对C的继承关系,C++没有自己的线程封装技术,一般而言我们创建线程时,还是用C的回调函数机制.类似的例子也挺多的.在Java等纯粹的面向对象语言,则不一样,不光有自己的独立的线程类型,对于回调,也是注册整个对象,而不是注册一个方法,如常用的观察者模式.这里,在网上查阅了大

  • C++之友元:友元函数和友元类详解 2014-09-27

    友元是一种允许非类成员函数访问类的非公有成员的一种机制.可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元 一.友元介绍我们知道,类的成员函数可以访问同类的其他成员函数,包括公有.私有和保护成员.而类的外部函数只能访问类的公有成员. 友元是一种允许非类成员函数访问类的非公有成员的一种机制. 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元. 友元函数 友元类 二.友元函数友元函数在类作用域外定义,但它需要在类体中进行说明 为了与该类的成员函数加以区别,定义的方式是在

  • 深入理解javascript中的立即执行函数(function(){-})() 2014-10-17

    这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){-})()包住业务代码,使用jquery时比较常见,需要的朋友可以参考下 javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( function(){-} )()和( function (){-} () )是两种javas

  • javascript的函数.创建对象.封装.属性和方法.继承 2014-10-31

    从一开始接触到js就感觉好灵活,每个人的写法都不一样,比如一个function就有N种写法 一,function 从一开始接触到js就感觉好灵活,每个人的写法都不一样,比如一个function就有N种写法 如:function showMsg(){},var showMsg=function(){},showMsg=function(){} 似乎没有什么区别,都是一样的嘛,真的是一样的吗,大家看看下面的例子 ///-----------------------------------------