存儲過程C返回一個結果集,存儲過程B用INSERT/EXEC PROC將C返回的結果集存入一個臨時表中並返回一個結果集,
如果存儲過程A用INSERT/EXEC PROC再將B的結果集存入一個臨時表,這時會報錯:INSERT EXEC 語句不能嵌套。
如果存儲過程A用INSERT/EXEC PROC再將B的結果集存入一個臨時表,這時會報錯:INSERT EXEC 語句不能嵌套。
解決方法就是:
將過程B的INSERT/EXEC PROC語句替換為
insert into #T
SELECT *
FROM OPENROWSET('MSDASQL',
'DRIVER={SQL Server};SERVER=192.168.0.1;UID=sa;PWD=111111;Initial Catalog=Pubs',
'EXEC pubs.dbo.pc') AS A
insert into #T
SELECT *
FROM OPENROWSET('MSDASQL',
'DRIVER={SQL Server};SERVER=192.168.0.1;UID=sa;PWD=111111;Initial Catalog=Pubs',
'EXEC pubs.dbo.pc') AS A
即可,不過好像在過程A中要先執行一下過程B才行,即在A過程的語句INSERT/EXEC PROC的前面加上exec B。
只要過程B先執行一次,以后可以不用再執行A也能夠正常執行了,這樣可將過程B設置為啟動時執行即可(用系統過程sp_procoption設置)
只要過程B先執行一次,以后可以不用再執行A也能夠正常執行了,這樣可將過程B設置為啟動時執行即可(用系統過程sp_procoption設置)
---A.建一個連接到自身數據庫的連接服務器 ---開啟該連接服務器的RPC功能,右擊該連接服務器,單擊屬性,單擊服務器選項,然后選中RPC和RPC輸出項即可 EXEC sp_addlinkedserver @server = 'self', @srvproduct = '', @provider = 'MSDASQL', @datasrc = NULL, @location = NULL, @provstr = 'DRIVER={SQL Server};Server=(local);Initial Catalog=master;uid=sa;pwd=123;' create proc pC as select top 10 * from authors drop proc pB create proc pB as select * into #T from authors where 1=0 --insert into #T exec pc insert into #T SELECT * FROM OPENROWSET('MSDASQL', 'DRIVER={SQL Server};SERVER=192.168.0.1;UID=sa;PWD=111111;Initial Catalog=Pubs', 'EXEC pubs.dbo.pc') AS A select * from #T create proc pA as select * into #T from authors where 1=0 exec pb insert into #T exec pB select * from #T exec pB exec pA
或者用下面的方法解決:
---B.創建鏈接服務器 ---用SQL命令建立與本Server的Linked Server. Exec sp_addlinkedserver '172.26.40.8','','SQLOLEDB','172.26.40.8' Exec sp_addlinkedsrvlogin '172.26.40.8','false',null,'sa','123' exec sp_serveroption '172.26.40.8','rpc','true' exec sp_serveroption '172.26.40.8','rpc out','true' --這個允許調用鏈接服務器上的存儲過程 調用示例如下, Create Table #TempCheckResult(iResult varchar(12),iMessage nvarchar(200)) Declare @iSQL nvarchar(200) Set @iSQL= 'Exec usp_PAL_CheckCompUsability '+'''SW89080571GN'''+',''W8905001U632A'''+',''Repair''' Insert Into #TempCheckResult EXEC(@iSQL) ---此句會報錯:An INSERT EXEC statement cannot be nested. Insert Into #TempCheckResult EXEC [172.26.40.6].PAL_COMPSN_P80.dbo.sp_executesql @iSQL ---@iSQL --須為nvarchar,varchar會報錯