SQL Server - Check all databases exist specific table by sp_MSforeachdb

在這邊主要是想要針對所有的資料庫來檢查相關的table是否存在,本來想要先取得我要針對

的資料庫,再將它儲存至暫存table內,緊接著再利用cursor來依序進行另外一段的SQL指令

檢查該DB下是否有該table存在,如果不存在的話則自動create。

SQL語法使用環境為:SQL Server 2012

利用下段SQL來確認是否要建立該table
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N''EMPLOYEES'')
BEGIN
....
END


前提是,要先切換至相關的DB,在此本想利用USE指令來組成字串後由EXEC執行

但是後來發現,DB並沒有進行切換的動作。也許可以利用

DB.INFORMATION_SCHEMA.TABLES的方式進行,但是這樣的話就得把所有的指令包裹成

字串的指令囉!

後來,從某一篇文章得知,如果您要在特定DB內進行相同指令的執行的話,可以利用master

提供的預存程序 sp_MSforeachdb。此SP可以丟進您要執行的SQL指令來針對所有的DB,而

且不用撰寫cursor來依序執行。

小弟要執行的相關SQL如下:

DECLARE @COMMAND VARCHAR(2000);
SET @COMMAND = 'IF CHARINDEX(''HOMEWORK'',''?'') > 0
BEGIN USE [?]
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N''EMPLOYEES'')
BEGIN
 CREATE TABLE EMPLOYEES
 (
  EMPLOYEEID INT NOT NULL,
  EMPLOYEENAME  VARCHAR(15) NULL,
  DEPARTMENT  VARCHAR(15) NULL,
  SALARY  NUMERIC(16,2) NULL,
  EMPLOYEESGROUP  VARCHAR(20) NOT NULL,
  CONSTRAINT  PK_EMPLOYEES  PRIMARY KEY (EMPLOYEEID,EMPLOYEESGROUP)
 );
 GRANT ALL ON  DBO.EMPLOYEES  TO PUBLIC;
END
ELSE
BEGIN
 PRINT ''DB [?] EMPLOYEES TABLE EXIST''
END
END'
EXEC SP_MSFOREACHDB @COMMAND

在第二行會先判斷要針對哪個DB進行檢查table是否存在,否則該SP會針對所有DB

PS. ? => DB NAME

將指令都組好之後,即assign給sp_MSforeachdb執行之。

PS. 如一開始提到的要執行的指令想不到最後還是把它包裹成字串,但唯一比較特別的是

不用利用到cursor就可以達成目的,也不失為一個特別的解決方法!

留言