EXEC(EXECUTE)函數(shù)訪問INSERTED或DELETED的內(nèi)部臨時(shí)觸發(fā)表
發(fā)布日期:2022-01-19 19:11 | 文章來源:腳本之家
然而有一個(gè)問題一直困攏至昨天,昨天是星期天本應(yīng)是休息的,但是這個(gè)問題沒有解決,因此這天算不上休息了。
問題就是改寫表的觸發(fā)器,涉及到EXEC(EXECUTE)函數(shù)訪問INSERTED或DELETED的內(nèi)部臨時(shí)觸發(fā)表,如:
EXECUTE('SELECT '+ @N +' = ISNULL(['+ @I +'],0) FROM inserted')
當(dāng)你嘗試執(zhí)行上面的SQL語句,會(huì)得到一個(gè)異常提示:invalid object name 'inserted'。我們無法顯示訪問INSERTED或DELETED的內(nèi)部臨時(shí)觸發(fā)表。
由于INSERTED或是DELETED表是動(dòng)態(tài)駐留在內(nèi)存中,而不是存儲(chǔ)在數(shù)據(jù)庫中,它不是顯式的。觸發(fā)器的執(zhí)行是在導(dǎo)致觸發(fā)器被觸發(fā)的執(zhí)行計(jì)劃中。當(dāng)我們使用EXEC(EXECUTE)或sp_executesql執(zhí)行動(dòng)態(tài)生成的SQL語句時(shí),它卻是另外一個(gè)單獨(dú)的執(zhí)行計(jì)劃。兩者之間的資源無法相互訪問,再加上計(jì)劃執(zhí)行完畢,內(nèi)存也隨之釋放資源了。
但是問題還是需要解決,Insus.NET想起的還是臨時(shí)表。可以把INSERTED或DELETED表中的數(shù)據(jù),首先轉(zhuǎn)換入臨時(shí)表了。這樣子,我們就可以對(duì)臨時(shí)表的數(shù)據(jù)進(jìn)行處理了。
SELECT * INTO #inserted FROM INSERTED
SELeCT * INTO #deleted FROM DELETED
實(shí)現(xiàn)代碼:
DECLARE @F NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX),@I) --@I動(dòng)態(tài)字段
EXECUTE ('SELECT ['+ @F +'] FROM #deleted)
復(fù)制代碼 代碼如下:
EXECUTE('SELECT '+ @N +' = ISNULL(['+ @I +'],0) FROM inserted')
復(fù)制代碼 代碼如下:
SELECT * INTO #inserted FROM INSERTED
SELeCT * INTO #deleted FROM DELETED
實(shí)現(xiàn)代碼:
復(fù)制代碼 代碼如下:
DECLARE @F NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX),@I) --@I動(dòng)態(tài)字段
EXECUTE ('SELECT ['+ @F +'] FROM #deleted)
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章