2017-05-12 26 views
0

我發現的內容似乎一次只顯示一個數據庫(例如,select * from information_schema.columns)。有沒有像sys.databases中的select *,它不僅包含所有的數據庫名稱,還包括它們自己的表名和列名?Microsoft SQL Server:查詢查看所有數據庫及其對應表和列的列表

想要看到服務器的所有這些:數據庫名稱,表名稱,列名稱。

我試圖熟悉新公司的服務器,並且想通過瀏覽每個數據庫中的表名和列來探索。另外,我沒有寫入權限,我在Tableau自定義SQL中執行此操作。

+0

您可以使用未記錄的sp_msforeachdb,但它有時會跳過數據庫。你也可以利用動態sql來做到這一點,這可能是我會做的。你想要輸出什麼?只有數據庫名稱,表名和列名? –

+0

做這樣的事情的唯一方法是通過動態SQL。你真正的目標是什麼?你爲什麼想這樣做?你認爲你需要什麼?也許你問的是錯誤的問題,因爲我無法想象這真的有什麼價值......它太籠統和廣泛了。你能把你的問題專注於你的具體需求嗎? – pmbAustin

+0

是的,只需要這三件事。我試圖熟悉新公司的服務器,並想通過瀏覽每個數據庫中的表名和列來探索。另外,我沒有寫權限,並且正在Tableau自定義SQL中執行此操作。 – JJBee

回答

-2

喲,也許試試這個?

--database名稱

SELECT名 FROM sys.databases中

--Table名稱

SELECT名 FROM SYS.TABLES

--column名稱

SELECT name FROM sys.columns

這有幫助嗎?

+0

對不起,這只是給你的名字。如果你想要更多,你也可以使用*。 – MLangford

+0

OP要求服務器上所有數據庫的信息,而不僅僅是當前的信息。 –

0

你看起來像這樣嗎?你可以嘗試msforeachdb

EXEC sp_MSforeachdb N' 
BEGIN 
    use ? 
    select * from information_schema.tables 
    select * from information_schema.columns 
END'; 
0

我不是無證程序的粉絲。而sp_msforeachdb有時會跳過數據庫,而且沒有人真的知道爲什麼。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx我也真的不在乎那些無證過程的遊標。如果你看看代碼,它是一個很大的難看的遊標。對於你想要的簡單東西,我更喜歡使用一些動態的sql和sys表來創建它。

下面是我將如何去完成這項任務。它實際上並沒有比無證過程更多的代碼。最大的好處就是很容易調試,並且沒有光標。 :)

declare @SQL nvarchar(max) = '' 

select @SQL = @SQL + 'select ''' + d.name + ''' as DatabaseName 
    , t.name collate SQL_Latin1_General_CP1_CI_AS as TableName 
    , c.name collate SQL_Latin1_General_CP1_CI_AS as ColumnName 
from ' + quotename(d.name) + '.sys.tables t 
join ' + quotename(d.name) + '.sys.columns c on c.object_id = t.object_id UNION ALL ' 
from sys.databases d 

set @SQL = LEFT(@SQL, len(@SQL) - 10) + ' order by DatabaseName, TableName, ColumnName' 

select @SQL --once you are satisfied the sql is correct just uncomment the line below 
--exec sp_executesql @SQL 
0

一個我以前使用過:

EXEC master.sys.sp_MSForEachDB N' 
    IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'') 
    BEGIN 
    USE ? 
    SELECT ''?'' AS theDatabase 
     , OBJECT_SCHEMA_NAME([tables].[object_id],DB_ID()) AS theSchema 
     , [tables].name AS theTable 
     , [columns].[name] AS theColumn 
     , [types].[name] AS theDatatype 
     , [columns].max_length AS columnSize 
     , [columns].[precision] AS columnPrecision 
     , [columns].scale AS columnScale 
     , [columns].is_nullable AS isNullable 
    FROM sys.tables AS [tables] 
    INNER JOIN sys.all_columns [columns] ON [tables].[object_id] = [columns].[object_id] 
    INNER JOIN sys.types [types] ON [columns].system_type_id = [types].system_type_id 
     AND [columns].user_type_id = [types].user_type_id 
    WHERE [tables].is_ms_shipped = 0 
    ORDER BY [tables].name, [columns].column_id 
    END 
' 

我通常轉儲到一個臨時表,所以我可以更好地處理所得到的數據。

我還沒有遇到sp_MSforEachDB缺失表的問題,但我會檢查Aaron關於該問題的文章。他絕對是我信任的名字。 :-)

相關問題