懶惰確實是推動世界進步的最大動力,為了省下工作時間來上網,剛弄了個能清理各個日誌表的存儲過程。過程中學會了使用 mssql 的 sp_executesql()。
sp_executesql() 的用途就是在執行時執行剛拼湊成的 sql 語句。整套大概這麼寫:
-- 定義變量
declare @sqlCommand nvarchar(500)
declare @ParmDefinition nvarchar(500)
declare @dbname varchar(50)
declare @dbid_check integer
declare @column_check varchar(50)
set @dbid_check = 1
set @column_check = 'dbid'
-- 拼湊 SQL 語句,注意要加 Unicode 的「N」
set @sqlCommand = N'select @dbname_out = name from sysdatabases where ' + @column_check + ' = @dbid'
-- 定義該語句的變量,@dbid 是 input,@dbname_out 則是 output
set @ParmDefinition = N'@dbid integer, @dbname_out varchar(50) output'
-- 執行語句
execute sp_executesql @sqlCommand, @ParmDefinition, @dbid = @dbid_check, @dbname_out = @dbname output;
print @dbname
我的系統有很多日誌表,每個都可能有不同的保留天數,有了這樣 dynamic sql 的功能,我就可以寫好一個通的存儲過程,設好 schedule job,以後只要在設定表中登記表名、保留天數,系統就可以自動處理,不必再為每一個新表寫獨立的代碼了。