2009年9月21日 星期一

An INSERT EXEC statement cannot be ne...


最近在撰寫一支 SQL Server Store Procedure 時,一直發生
An INSERT EXEC statement cannot be nested 的錯誤訊息。
SQL 語法如下:
create table #tFinishAll ( IsFinish int )
insert into #tFinishAll (IsFinish) 
exec pr_prog_section3_is_report_finish  
當我單純的只有執行 exec pr_prog_section3_is_report_finish 時,
結果是正常的,但跟 insert into #tFinishAll (IsFinish)  一起執行時,
就會出錯。

詳細檢視了 pr_prog_section3_is_report_finish 這支 Store Procedure,
發現它裡面也有類似先建立一個暫存資料表,然後又透過 執行 
Store Procedure 來新增資料的方式。

原來,這種情況在 SQL 2005 就會被視為 Nested Insert Exec而被禁止。
詳細文章可參考:http://www.windows-tech.info/15/fe648af19f711aba.php
所以,我就需要改寫自己的 Store Procedure ,改成透過 OPENROWSET
的方式來解決。於是將自己的程式改寫如下:

SELECT *
FROM OPENROWSET
(
'SQLOLEDB',
'Server=SQLServer;uid=test_id;pwd=test_pwd',
' SET FMTONLY OFF exec pr_prog_section3_is_report_finish '
)


除了使用 OPENROWSET 語法改寫之外,另外要注意的,就是要加上
SET FMTONLY OFF關鍵字,宣告這個 Script 語法裡面是可以允許建立
暫存資料表的。

沒有留言:

張貼留言