2010-07-07 17 views
0

我基本上試圖通過使用sp_msforeachdb找出存在於SQL SERVER中的所有數據庫的所有表。如何使用臨時表變量(例如@temp)來保存sp_msforeachdb的結果

如果我寫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 

,它會拋出錯誤(目前我DONOT記得)。

問題是

1)是否有可能使用表變量

2)是否有可能得到使用CTE做同樣的事情做同樣的東西?

SQL Server 2005的

感謝

回答

3

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)無

相關問題