首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,如何避免“无法嵌套的INSERT EXEC语句”异常?

在这种情况下,如何避免“无法嵌套的INSERT EXEC语句”异常?
EN

Database Administration用户
提问于 2017-01-11 15:21:13
回答 2查看 30.9K关注 0票数 3

当我运行以下脚本时,它运行得很好:

代码语言:javascript
复制
declare @temp table
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);
INSERT @temp
   exec sp_msforeachdb  @command1='use ?; Exec sp_helpfile;' 

但是当我使用我自己的sp_foreachdb过程时,源代码在下面的链接上:

更可靠、更灵活的sp_MSforeachdb

代码语言:javascript
复制
declare @temp table
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);
INSERT @temp
   exec sp_foreachdb  @command='use ?; Exec sp_helpfile;'   

我得到了一个异常(请注意,我在该过程中添加了异常处理)

代码语言:javascript
复制
--EXCEPTION WAS CAUGHT--
THE ERROR NUMBER:8164

SEVERITY: 16
STATE: 1

PROCEDURE: sp_foreachdb
LINE NUMBER: 165

ERROR MESSAGE: 
An INSERT EXEC statement cannot be nested.
------------------------------------ the sql ------------------------------------

SELECT name FROM sys.databases WHERE 1=1 AND state_desc = N'ONLINE' AND is_read_only = 0
Msg 16916, Level 16, State 1, Procedure sp_foreachdb, Line 239
A cursor with the name 'c' does not exist.
Msg 16916, Level 16, State 1, Procedure sp_foreachdb, Line 240
A cursor with the name 'c' does not exist.

(0 row(s) affected)
EN

回答 2

Database Administration用户

发布于 2017-01-11 16:09:18

亚伦的sp_foreachdb的源代码包含以下一行:

INSERT #x EXEC sp_executesql @sql;

根据您的错误消息:

不能嵌套INSERT EXEC语句。

因此,下面这样的代码将无效,因为它嵌套的是INSERT xxx EXEC xxx代码。

代码语言:javascript
复制
INSERT @temp
exec sp_msforeachdb  @command1='use ?; Exec sp_helpfile;'
票数 2
EN

Database Administration用户

发布于 2017-01-11 22:16:34

如果sp_foreachdb将返回单个结果集,则通过分布式查询方法连接到您自己的服务器将完成此任务。

代码语言:javascript
复制
create table #temp 
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);

insert into #temp
select  *
FROM OPENROWSET('SQLNCLI', 'SERVER=****;UID=****;PWD=****',
' exec sp_foreachdb  @command=''  Exec ?..sp_helpfile;''  WITH RESULT SETS         ((name varchar(255),
field varchar(255),
filename varchar(255),
filegroup varchar(255),
size varchar(255),
maxsize varchar(255),
growth varchar(255),
usage varchar(255))); ')

select * from #temp

上面的查询将只返回sp_foreachdb执行的第一个结果集。但是下面的查询将返回结果集中所有数据库的结果。

代码语言:javascript
复制
create table #temp 
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);

exec sp_foreachdb  @command='INSERT INTO #temp  Exec ?..sp_helpfile;'
select * from #temp
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/160739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档