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