web-dev-qa-db-fra.com

Comment éviter l'exception de cette situation "une instruction INSEXED Exece ne peut pas être imbriquée" une exception sur cette situation?

quand j'exécute le script suivant, ça marche bien:

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;' 

mais lorsque j'utilise ma propre procédure SP_Foreachdb, le code source est sur ce lien ci-dessous:

n sp_msforeachdb plus fiable et plus flexible

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;'   

Je reçois une exception (veuillez noter que j'ai ajouté une manipulation des exceptions sur cette procédure)

--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)
2
Marcello Miorelli

Le code source pour Aaron's sp_foreachdb contient la ligne suivante:

INSERT #x EXEC sp_executesql @sql;

Selon votre message d'erreur:

Une instruction Inserde Exec ne peut pas être imbriquée.

Alors le code comme celui-ci ci-dessous ne sera pas valide car il est niché INSERT xxx EXEC xxx code.

INSERT @temp
exec sp_msforeachdb  @command1='use ?; Exec sp_helpfile;'
2
James Anderson

Connexion à votre propre serveur via des méthodes de requête distribuées ferait l'affaire si SP_Foreachdb reviendrait à des résultats simples.

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

au-dessus de la requête ne renvoie que les premiers résultatsset de SP_Foreachdb Execution. Mais ci-dessous la requête retournera le résultat pour toutes les bases de données dans un seul résultateur.

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
SelmanAY