SQL Server - Check all databases exist specific table by sp_MSforeachdb

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

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

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

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

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

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

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

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

字串的指令囉!

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

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

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

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

  1. DECLARE @COMMAND VARCHAR(2000);
  2. SET @COMMAND = 'IF CHARINDEX(''HOMEWORK'',''?'') > 0
  3. BEGIN USE [?]
  4. IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N''EMPLOYEES'')
  5. BEGIN
  6. CREATE TABLE EMPLOYEES
  7. (
  8. EMPLOYEEID INT NOT NULL,
  9. EMPLOYEENAME VARCHAR(15) NULL,
  10. DEPARTMENT VARCHAR(15) NULL,
  11. SALARY NUMERIC(16,2) NULL,
  12. EMPLOYEESGROUP VARCHAR(20) NOT NULL,
  13. CONSTRAINT PK_EMPLOYEES PRIMARY KEY (EMPLOYEEID,EMPLOYEESGROUP)
  14. );
  15. GRANT ALL ON DBO.EMPLOYEES TO PUBLIC;
  16. END
  17. ELSE
  18. BEGIN
  19. PRINT ''DB [?] EMPLOYEES TABLE EXIST''
  20. END
  21. END'
  22. EXEC SP_MSFOREACHDB @COMMAND

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

PS. ? => DB NAME

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

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

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

留言