[SQL]在某些DB中執行相同的Script

  • 2984
  • 0
  • SQL
  • 2014-05-19

如果想要在某些DB中執行相同的Script,如建立Index,要如何做呢?

如果想要在某些DB中執行相同的Script,直覺想到就是使用 sp_MSforeachdb 。

以下建立2個DB,分別建立T1及T2資料表,然後再透過 sp_MSforeachdb 來建立 index 及 drop index 來練習,如下,

1:建立測試的資料

USE master
GO

CREATE DATABASE MyDB1;
GO
CREATE DATABASE MyDB2;
GO	
USE MyDB1
GO

CREATE TABLE T1
(c1 INT
, c2 VARCHAR(20)
);

CREATE TABLE T2
(c1 INT
, c2 VARCHAR(20)
);


USE MyDB2
GO

CREATE TABLE T1
(c1 INT
, c2 VARCHAR(20)
);

CREATE TABLE T2
(c1 INT
, c2 VARCHAR(20)
);

 

2.1:開始用 sp_MSforeachdb 建立 Table 的Index

DECLARE @runSQL nvarchar(2000)
--比較DB的話,也可以使用NOT IN 如,  'IF ''[?]'' NOT IN (''[master]'', ''[model]'', ''[msdb]'', ''[tempdb]'')
SET @runSQL = 'IF ''[?]'' IN (''[MyDB2]'', ''[MyDB1]'')
	 begin
		Use [?]; 
		CREATE NONCLUSTERED INDEX nx_T1_c1 
		ON T1 (c1) INCLUDE(c2);
		CREATE NONCLUSTERED INDEX nx_T2_c1 
		ON T2 (c1) INCLUDE(c2);
	end;
	 ';

EXEC sp_MSforeachdb @runSQL;

image

 

2.2:開始用 sp_MSforeachdb 如果script太多的話,可以用到 @command2, @command3哦!

DECLARE @runSQL_1 nvarchar(2000), @runSQL_2 nvarchar(2000)
 
SET @runSQL_1 = 'IF ''[?]'' IN (''[MyDB2]'', ''[MyDB1]'')
	 begin
		Use [?]; 
		DROP INDEX nx_T1_c1 ON T1;
	end;
	 ';

SET @runSQL_2 = 'IF ''[?]'' IN (''[MyDB2]'', ''[MyDB1]'')
	 begin
		Use [?]; 
		DROP INDEX nx_T2_c1 ON T2;
	end;
	 ';


EXEC sp_MSforeachdb @command1 = @runSQL_1, @command2 = @runSQL_2;

image

 

3:測試結束 清除料

USE master
GO
DROP DATABASE MyDB1;
DROP DATABASE MyDB2;

 

參考資料

不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解

How to execute SQL against all DBs on a Server

有没有办法切换数据库

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^