我基本上是在尝试使用 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。
谢谢
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) 否
| 归档时间: |
|
| 查看次数: |
6469 次 |
| 最近记录: |