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

时间:2010-07-07 05:15:17

标签: 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

这很好用。

然而,如果我这样做

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

不接受

此外,如果我这样做

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

Select * from CTE

,它会引发错误(现在我不记得了)。

问题是

1)是否可以使用表变量

执行相同的操作

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

SQL SERVER 2005。

由于

1 个答案:

答案 0 :(得分:4)

1)是的,您只需要为列使用正确的名称(object_id,而不是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)否