如何使用临时表变量(例如@temp)来保存 sp_msforeachdb 的结果

lea*_*ner 3 sql-server-2005

我基本上是在尝试使用 sp_msforeachdb 找出 SQL SERVER 中存在的所有数据库的所有表。

如果我写 exec sp_msforeachdb 'select "?" AS DatabaseNames,* from [?].sys.tables'

我会得到很好的结果,但是对于每个数据库,都会创建一个单独的记录集。

现在如果我使用

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
Run Code Online (Sandbox Code Playgroud)

这工作正常。

但是,如果我这样做

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
Run Code Online (Sandbox Code Playgroud)

它不接受

此外,如果我这样做

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

Select * from CTE
Run Code Online (Sandbox Code Playgroud)

,它会引发错误(目前我不记得了)。

问题是

1)是否可以使用表变量来做同样的事情

2)是否有可能使用 CTE 完成同样的事情?

SQL 服务器 2005。

谢谢

Rem*_*anu 7

1) 是的,您只需要为您的列使用正确的名称 ( object_id, not 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 
Run Code Online (Sandbox Code Playgroud)

2) 否