我基本上试图通过使用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。
由于
答案 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)否