2013-01-08 63 views
2

我在SQL Server上有許多數據庫(超過50個)。所有數據庫是相同的。每個數據庫都有一個名爲DBVersion的表。每個DBVersion都有一個列:「Version」,其類型爲varchar。在這張表中,總是存在一條記錄。從SQL Server中的多個數據庫的表中選擇一個字段

如何循環遍歷所有數據庫,從表DBVersion中選擇「Version」並在Microsft SQL Server Management Studio中打印結果?

結果應該是這樣的:

  1. 數據庫1 - 版本:5
  2. 的Database2 - 版本:8
  3. Database50 - 版本:6

在此先感謝。

+0

所有這些數據庫都在同一個SQL-Server實例上嗎? – GarethD

回答

2

您可以使用sp_msforeachdb到itereate數據庫,如果他們在SQL-服務器

CREATE TABLE #tmp (DatabaseName VARCHAR(50), Version VARCHAR(200)); 

EXECUTE master.sys.sp_MSforeachdb ' 
           USE [?]; 
           IF EXISTS 
            ( SELECT 1 
             FROM sys.tables 
             WHERE [Object_ID] = OBJECT_ID(N''dbo.DBVersion'') 
            ) 
            BEGIN 
             INSERT #tmp (DatabaseName, TableName) 
             SELECT ''?'', [Version] 
             FROM dbo.DBVersion 
            END'; 

SELECT * 
FROM #tmp; 

DROP TABLE #tmp; 

相同的實例有一個關於使用無證程序,所以你可以用光標改寫這個有些sceptisism:

CREATE TABLE #tmp (DatabaseName VARCHAR(50), Version VARCHAR(200)); 

DECLARE DBCursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY 
FOR 
    SELECT Name 
    FROM sys.databases; 
OPEN DBCursor; 

DECLARE @DBName VARCHAR(200) = ''; 
FETCH NEXT FROM DBCursor INTO @DBName; 

WHILE @@FETCH_STATUS != 0 
    BEGIN 
     DECLARE @SQL NVARCHAR(MAX) = N'USE ' + QUOTENAME(@DBName) + ' 
             IF EXISTS 
              ( SELECT 1 
               FROM sys.tables 
               WHERE [Object_ID] = OBJECT_ID(N''dbo.DBVersion'') 
              ) 
              BEGIN 
               INSERT #tmp (DatabaseName, TableName) 
               SELECT @DB, [Version] 
               FROM dbo.DBVersion 
              END'; 
     EXECUTE SP_EXECUTESQL @SQL, N'@DB VARCHAR(200)', @DBName; 

     FETCH NEXT FROM DBCursor INTO @DBName; 
    END 

CLOSE DBCursor; 
DEALLOCATE DBCursor; 

SELECT * 
FROM #tmp; 

DROP TABLE #tmp; 
+0

非常感謝!我使用第一種方法遍歷SQL Server相同實例上的所有數據庫。 – naregkar

0

這會幫助你嗎?

SELECT 'Database1-Version:'+CAST(Version AS NVARCHAR) FROM Database1.schemaname.DBVersion UNION 
SELECT 'Database2-Version:'+CAST(Version AS NVARCHAR) FROM Database2.schemaname.dbo.DBVersion UNION 
.... 
+0

需要添加架構 - > database.schema.dbversion – twoleggedhorse

+0

改進此答案,您可以動態生成帶有for循環的選擇字符串,並使用[EXEC]執行它(http://msdn.microsoft.com/en-us /library/ms188332.aspx) –

+0

@twoleggedhorse是的,thanx我編輯了答案。 – TechDo

相關問題