2015-12-17 15 views
1

我有一個特定的腳本,需要在SQL Server中的所有數據庫中執行。我已使用以下邏輯來遍歷除系統數據庫之外的所有數據庫。如何在所有數據庫中使用'use'命令來執行sql中的某些腳本

declare @DBName varchar(500) 
DECLARE @Database_id int 
DECLARE @Query  varchar(MAX) 
select @Database_id = MIN(database_id) from sys.databases where  database_id>4 
while @Database_id is not null 
begin 
select @DBName=name from sys.databases where [email protected]_id 
set @Query = 'Use'[email protected] 
      --some script 
      Print ''[email protected]+'' 
      exec (@Query) 
select @Database_id = MIN(database_id) from sys.databases where database_id>4 AND database_id>@Database_id 
end 

但問題是我不能對變量使用'Use'命令。有沒有其他方法可以使用「使用」命令來打開數據庫?

我不想使用sp_MSforeachdb命令,因爲我的查詢太長。 任何幫助,將不勝感激!

+0

是否要在實例中的所有數據庫上運行腳本,還是隻需要執行SP的用戶提供的特定DB? – SQLmojoe

+0

我想在實例中的所有數據庫中運行 –

+0

我想在除系統數據庫之外的所有數據庫中運行腳本。 –

回答

1

這樣做有一個未公開的功能。您可以使用問號在DB的名字的地方:

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; EXEC sp_spaceused' 

找到這個例子,更多的解釋在這裏:http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx

編輯:從您的上述評論,我覺得,你不想includ系統dbs進入你的運行。這似乎是,Q位棘手的檢測,一個數據庫是一個系統數據庫或沒有,但你可以是這樣的:(!有關SQL Server 2005)

DECLARE @cmd VARCHAR(1000)='USE [?];IF DB_ID(DB_NAME())<=4 RETURN;EXEC sp_spaceused;' 
EXECUTE master.sys.sp_MSforeachdb @cmd; 
GO 

閱讀有關的缺陷的位置:SQL Server: How to tell if a database is a system database?

如果你不喜歡這個<=4你可以簡單地做這樣

IF DB_NAME() IN('master','model',... any more names here ...) RETURN; 

唯一真正的限制,我的就是知道,sp_MSforeachdb不喜歡「GO」。

+0

謝謝Shunugo,但我真的不想使用sp_MSforeachdb。如果我沒有弄錯,任何與它有關的查詢都有一定的限制。 –

+0

@SujanEmmanuel不知道「任何查詢的某些限制」對你來說意味着什麼,但除此之外,你應該使用動態SQL和CURSOR。我會在幾分鐘內編輯我的答案... – Shnugo

+0

@SujanEmmanuel,請在 – Shnugo

相關問題