2010-07-07 4 views
0

Je cherche essentiellement à trouver toute la table de toutes les bases de données présentes dans le serveur SQL en utilisant sp_msforeachdb.Comment utiliser une variable de table temporaire (par exemple @temp) pour conserver le résultat de sp_msforeachdb

Si j'écris exec sp_msforeachdb 'select "?" AS DatabaseNames,* from [?].sys.tables'

j'obtenir le résultat bien, mais pour chaque base de données, un ensemble séparé d'enregistrement sera créé.

Maintenant, si j'utilise

CREATE TABLE #DBINFO 
(
      DbName NVARCHAR(255) 
      ,ObjectID NVARCHAR(255) 
) 

INSERT INTO #DBINFO 
exec sp_msforeachdb 'select "?" AS DatabaseNames,ObjectID from [?].sys.tables' 

SELECT * FROM #DBINFO 

Cela fonctionne très bien.

Cependant, si je

Declare @DBINFO Table(DbName NVARCHAR(255),ObjectID NVARCHAR(255)) 
INSERT INTO @DBINFO 
    exec sp_msforeachdb 'select "?" AS DatabaseNames,ObjectID from [?].sys.tables' 

    SELECT * FROM @DBINFO 

Il n'accepte pas

De plus, si je

;With CTE AS 
(
    exec sp_msforeachdb 'select "?" AS DatabaseNames,* from [?].sys.tables' 
) 

Select * from CTE 

, il jette l'erreur (Pour l'instant, je me souviens que DONOT).

La question est

1) Est-il possible de faire la même chose en utilisant une table de variables

2) Est-il possible d'obtenir la même chose faite en utilisant CTE?

SQL Server 2005.

Merci

Répondre

3

1) Oui, vous avez juste besoin d'utiliser les noms propres pour vos colonnes (object_id, non ObjectID):

Declare @DBINFO Table(DbName NVARCHAR(255),ObjectID NVARCHAR(255)) 
INSERT INTO @DBINFO 
exec sp_msforeachdb 'select "?" AS DatabaseNames,object_id from [?].sys.tables' 
SELECT * FROM @DBINFO 

2) Non

Questions connexes