當需要對符合特定命名規則的所有資料表、欄位執行相同操作(如統一修改資料型別、新增預設值、更新資料等)時,手寫大量重複 SQL 不僅低效且易出錯。本文介紹的預存程序 SP_execSQLonDB 可動態組裝並批量執行指定 SQL。
| 參數 | 型別 | 用途 |
|---|---|---|
| @TABLENAME | VARCHAR(50) | 表名過濾條件,支援多名稱以逗號分隔 |
| @COLUMNNAME | VARCHAR(50) | 欄位名過濾條件,支援多名稱以逗號分隔 |
| @SQL | NVARCHAR(4000) | 要執行的 SQL 範本,可包含佔位符 |
| @INCLUDE_NTI | CHAR(1) | 是否包含 Text/NText/Image 類型欄位,預設 'N' |
@INCLUDE_NTI 合法性。sysobjects、syscolumns、sysusers 系統表,取得符合條件的「資料表.擁有者」與「欄位名」清單。
@INCLUDE_NTI = 'N',排除 xtype 為 35、99、34(Text/NText/Image)的欄位。@TABLENAME、@COLUMNNAME 以 LIKE 進行模糊比對。EXEC sp_executesql 執行。SET @strSQL = N'DECLARE TabColCursor CURSOR FOR
SELECT RTRIM(LTRIM(SU.name)) + ''.'' + LTRIM(RTRIM(SO.name)), SC.name
FROM sysobjects SO
INNER JOIN syscolumns SC ON SO.id = SC.id
INNER JOIN sysusers SU ON SO.uid = SU.uid
WHERE SO.xtype = ''U'' '
IF @INCLUDE_NTI = 'N'
SET @strSQL = @strSQL + ' AND SC.xtype NOT IN (35, 99, 34) '
IF @TABLENAME IS NOT NULL AND LTRIM(RTRIM(@TABLENAME)) <> ''
BEGIN
SET @TABLENAME = REPLACE(@TABLENAME, ', ', ',')
SET @strSQL = @strSQL + ' AND (SO.name LIKE ''' + REPLACE(@TABLENAME, ',', ''' OR SO.name LIKE ''') + ''')'
END
-- 類似處理 @COLUMNNAME ...
-- 將所有以 'tbl_' 開頭的資料表中,名稱包含 'date' 的欄位型別改為 DATETIME
EXEC SP_execSQLonDB
@TABLENAME = 'tbl_%',
@COLUMNNAME = '%date%',
@SQL = 'ALTER TABLE ? ALTER COLUMN ? DATETIME',
@INCLUDE_NTI = 'N'