当我运行以下脚本时,它运行得很好:
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过程时,源代码在下面的链接上:
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;' 我得到了一个异常(请注意,我在该过程中添加了异常处理)
--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)发布于 2017-01-11 16:09:18
亚伦的sp_foreachdb的源代码包含以下一行:
INSERT #x EXEC sp_executesql @sql;
根据您的错误消息:
不能嵌套INSERT EXEC语句。
因此,下面这样的代码将无效,因为它嵌套的是INSERT xxx EXEC xxx代码。
INSERT @temp
exec sp_msforeachdb @command1='use ?; Exec sp_helpfile;'发布于 2017-01-11 22:16:34
如果sp_foreachdb将返回单个结果集,则通过分布式查询方法连接到您自己的服务器将完成此任务。
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执行的第一个结果集。但是下面的查询将返回结果集中所有数据库的结果。
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 #temphttps://dba.stackexchange.com/questions/160739
复制相似问题