欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

EXEC(EXECUTE)函數(shù)訪問INSERTED或DELETED的內(nèi)部臨時觸發(fā)表

 更新時間:2012年01月20日 21:32:08   作者:  
近段時間,MS SQL方面,一直需要開發(fā)動態(tài)方面的存儲過程或是觸發(fā)器以及表函數(shù)。因為程序設(shè)計一開始就是讓用戶動態(tài)添或是刪除一個表的字段,然而這個表的相關(guān)存儲過程或是觸發(fā)器以及為報表準備的表函數(shù)也會隨之這個表的字段變化而變化
剛開始時,這個表的字段很少(10個以內(nèi)),前開發(fā)者把這個表的所有存儲過程與觸發(fā)器以及表函數(shù)全是寫死了。用戶每添加一些字段,都需要手動去更改這些存儲過程與觸發(fā)器以及表函數(shù)?,F(xiàn)在這個表的字段已經(jīng)高達300個以上,有可能還會增長,因此Insus.NET的業(yè)務(wù)就是把這此靜態(tài)全改寫為動態(tài)處理。

然而有一個問題一直困攏至昨天,昨天是星期天本應(yīng)是休息的,但是這個問題沒有解決,因此這天算不上休息了。

問題就是改寫表的觸發(fā)器,涉及到EXEC(EXECUTE)函數(shù)訪問INSERTED或DELETED的內(nèi)部臨時觸發(fā)表,如:
復(fù)制代碼 代碼如下:

EXECUTE('SELECT '+ @N +' = ISNULL(['+ @I +'],0) FROM inserted')


當你嘗試執(zhí)行上面的SQL語句,會得到一個異常提示:invalid object name 'inserted'。我們無法顯示訪問INSERTED或DELETED的內(nèi)部臨時觸發(fā)表。

由于INSERTED或是DELETED表是動態(tài)駐留在內(nèi)存中,而不是存儲在數(shù)據(jù)庫中,它不是顯式的。觸發(fā)器的執(zhí)行是在導(dǎo)致觸發(fā)器被觸發(fā)的執(zhí)行計劃中。當我們使用EXEC(EXECUTE)或sp_executesql執(zhí)行動態(tài)生成的SQL語句時,它卻是另外一個單獨的執(zhí)行計劃。兩者之間的資源無法相互訪問,再加上計劃執(zhí)行完畢,內(nèi)存也隨之釋放資源了。

但是問題還是需要解決,Insus.NET想起的還是臨時表??梢园袸NSERTED或DELETED表中的數(shù)據(jù),首先轉(zhuǎn)換入臨時表了。這樣子,我們就可以對臨時表的數(shù)據(jù)進行處理了。

復(fù)制代碼 代碼如下:

SELECT * INTO #inserted FROM INSERTED
SELeCT * INTO #deleted FROM DELETED



實現(xiàn)代碼:

復(fù)制代碼 代碼如下:

DECLARE @F NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX),@I) --@I動態(tài)字段
EXECUTE ('SELECT ['+ @F +'] FROM #deleted)

相關(guān)文章

最新評論