如果想要在某些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;
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;
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:從零開始的軟體開發生活」
請大家繼續支持 ^_^