在這邊主要是想要針對所有的資料庫來檢查相關的table是否存在,本來想要先取得我要針對
的資料庫,再將它儲存至暫存table內,緊接著再利用cursor來依序進行另外一段的SQL指令
檢查該DB下是否有該table存在,如果不存在的話則自動create。
SQL語法使用環境為:SQL Server 2012
利用下段SQL來確認是否要建立該table
前提是,要先切換至相關的DB,在此本想利用USE指令來組成字串後由EXEC執行
但是後來發現,DB並沒有進行切換的動作。也許可以利用
DB.INFORMATION_SCHEMA.TABLES的方式進行,但是這樣的話就得把所有的指令包裹成
字串的指令囉!
後來,從某一篇文章得知,如果您要在特定DB內進行相同指令的執行的話,可以利用master
提供的預存程序 sp_MSforeachdb。此SP可以丟進您要執行的SQL指令來針對所有的DB,而
且不用撰寫cursor來依序執行。
小弟要執行的相關SQL如下:
在第二行會先判斷要針對哪個DB進行檢查table是否存在,否則該SP會針對所有DB
PS. ? => DB NAME
將指令都組好之後,即assign給sp_MSforeachdb執行之。
PS. 如一開始提到的要執行的指令想不到最後還是把它包裹成字串,但唯一比較特別的是
不用利用到cursor就可以達成目的,也不失為一個特別的解決方法!
的資料庫,再將它儲存至暫存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就可以達成目的,也不失為一個特別的解決方法!
留言
張貼留言