An INSERT EXEC statement cannot be nested 问题

shanwa2008 2011-02-15 11:03:43

想把查询SP(querySearch)的查询结果集insert into 到test_querySearch存储过程中表变量@TempTable中,但是查询的SP中也有INSERT INTO @TempTable EXEC SP_EXECUTESQL格式的插入操作。执行test sp报:An INSERT EXEC statement cannot be nested.
查询的SP(querySearch)不能修改,不知道还有没有其他的方法在test_querySearch存储过程中获取查询SP(querySearch)的结果集?

--查询SP
create proc querySearch
parameter1 varchar(20),
parameter2 varchar(20),
totalCount int out
as

declare @temptable
(
a int,
b varchar(20)
)

insert into @temptable
EXEC SP_EXECUTESQL N'select * from tablename'

go

--test sp

create proc test_querySearch
parameter1 varchar(20),
parameter2 varchar(20),
totalCount int out
as

declare @temptable
(
a int,
b varchar(20)
)

declare totalCount int

insert into @temptable
EXEC SP_EXECUTESQL N'querySearch
parameter1 = ''1'',
parameter2 = ''3'',
totalCount = 1
'
go
...全文
347 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2011-02-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shanwa2008 的回复:]

引用 5 楼 roy_88 的回复:
可以這樣改,第1個存儲過程不需要表變量存儲,直接返回結果

SQL code
use test
go
CREATE TABLE tablename
(
a int,
b varchar(20)
)
INSERT tablename SELECT 1,'a'

go
--查询SP
create proc querySearch……
[/Quote]
那樣 querySearch--要在最后加上 select * from 表變量

把test_querySearch改為直接返回結果就行了

shanwa2008 2011-02-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 roy_88 的回复:]
可以這樣改,第1個存儲過程不需要表變量存儲,直接返回結果

SQL code
use test
go
CREATE TABLE tablename
(
a int,
b varchar(20)
)
INSERT tablename SELECT 1,'a'

go
--查询SP
create proc querySearch
@parameter1 varchar……
[/Quote]

非常感谢楼上roy_88的回复,但是这里有个前提条件是:查询的SP是不能修改的!!
在test sp中还有其他的方法可以获取查询SP的结果集?
急急急....

中国风 2011-02-15
  • 打赏
  • 举报
回复
可以這樣改,第1個存儲過程不需要表變量存儲,直接返回結果
use test
go
CREATE TABLE tablename
(
a int,
b varchar(20)
)
INSERT tablename SELECT 1,'a'

go
--查询SP
create proc querySearch
@parameter1 varchar(20),
@parameter2 varchar(20)
as

--取消這個表變量
--declare @temptable table
--(
--a int,
--b varchar(20)
--)

--insert into @temptable
EXEC SP_EXECUTESQL N'select * from tablename'

go

--test sp

create proc test_querySearch
@parameter3 varchar(20),
@parameter4 varchar(20)
as

declare @temptable1 table
(
a int,
b varchar(20)
);


insert into @temptable1(a,b)
EXEC SP_EXECUTESQL N'execute querySearch @parameter1=@parameter1,@parameter2=@parameter2',N'@parameter1 varchar(20),@parameter2 varchar(20)',@parameter3,@parameter4
SELECT * FROM @temptable1--顯示結果
go
EXEC querySearch @parameter1=1,@parameter2=2

EXEC test_querySearch @parameter3=1,@parameter4=3


shanwa2008 2011-02-15
  • 打赏
  • 举报
回复
use test
go

--查询SP
create proc querySearch
@parameter1 varchar(20),
@parameter2 varchar(20)
as

declare @temptable table
(
a int,
b varchar(20)
)

insert into @temptable
EXEC SP_EXECUTESQL N'select * from tablename'

go

--test sp

create proc test_querySearch
@parameter3 varchar(20),
@parameter4 varchar(20)
as

declare @temptable1 table
(
a int,
b varchar(20)
)


insert into @temptable1
EXEC SP_EXECUTESQL N'dbo.querySearch
@parameter1 = 1,
@parameter2 = ''3''
'
go

不好意思,我刚才手误,一些参数符号写错了,现在修改了,执行后报错信息:
Msg 8164, Level 16, State 1, Procedure querySearch, Line 14
An INSERT EXEC statement cannot be nested.

(0 row(s) affected)


SQL77 2011-02-15
  • 打赏
  • 举报
回复
注释
可将函数和变量声明为 table 类型。table 变量可用于函数、存储过程和批处理中。

尽可能使用表变量而不使用临时表。table 变量有以下优点:

table 变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。
在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是,table 不能用在下列语句中:

INSERT INTO table_variable EXEC 存储过程。

SELECT select_list INTO table_variable 语句。

在定义 table 变量的函数、存储过程或批处理结束时,自动清除 table 变量。

在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。


涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
不支持在表变量之间进行赋值操作。另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

SQL77 2011-02-15
  • 打赏
  • 举报
回复


DECLARE @T TABLE(ID INT)

INSERT @T EXEC P

/*服务器: 消息 197,级别 15,状态 1,行 4
无法在向表插入变量时将 EXECUTE 用作源。


改临时表
fcuandy 2011-02-15
  • 打赏
  • 举报
回复
insert 后接的是一个结果集,而不是一个表结构或对象。

insert ... select .. from tb
insert ... exec sp
你的结实实质上是 insert ... tb 并没有select的过程, 这个roy已经说了。
如果非要不改动querySP的话,那么只有改test sp, 采用如下方式的语句:
create proc testSP
(...)
AS
insert testTB select ... from openrowset('sqloledb','.......','exec ....')

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧