sp_executesql
sp_executesql
透過指定參數的方法動態組出 T-SQL 指令,來避免 SQL injection。也因為此預存程序支援參數替代,所以 sp_executesql 會比 EXECUTE 更具有多變性;同時由於 sp_executesql 所產生的執行計畫更能讓 SQL Server 重複使用,因此 sp_executesql 也會比 EXECUTE 更有效率。
資料來源(文件中提到的更大自由性是支援替代參數,使用 EXECUTE 陳述式時,所有的參數值都必須轉換成字元或 Unicode,並構成 Transact-SQL 字串的一部分)
https://technet.microsoft.com/zh-tw/library/ms175170(v=sql.105).aspx
--以Fully Backup為例
DECLARE @sql VARCHAR(MAX)
,@DatabaseName nvarchar(300) -- 存放資料庫名稱
,@Timestamp varchar(30) -- 存放時間標記
,@MirrorFullPath nvarchar(2500) -- 存放備份檔放置的完整路徑
,@SQL_Name varchar(30) -- select @@SERVERNAME
set @DatabaseName='ABC'
set @SQL_Name=(select @@SERVERNAME)
set @Timestamp = convert(varchar, getdate(),112) +
replace(convert(varchar, getdate(),108), ':', '')
-- 指定備份檔放置的遠端資料夾的路徑
SET @sql='BACKUP DATABASE '+@DatabaseName+CHAR(13)+
'TO DISK='+'''Q:\SQLDB_Backup\'+@DatabaseName+'\'+@DatabaseName+'_'+@Timestamp+'.bak'''+CHAR(13)+
' WITH FORMAT,Compression'
Exec (@sql)
--改寫成
DECLARE @sql NVARCHAR(MAX)
,@DatabaseName nvarchar(300) -- 存放資料庫名稱
,@Timestamp Nvarchar(30) -- 存放時間標記
,@MirrorFullPath nvarchar(2500) -- 存放備份檔放置的完整路徑
,@SQL_Name Nvarchar(30) -- select @@SERVERNAME
set @DatabaseName='ABC'
set @SQL_Name=(select @@SERVERNAME)
set @Timestamp = convert(varchar, getdate(),112) +
replace(convert(varchar, getdate(),108), ':', '')
-- 指定備份檔放置的遠端資料夾的路徑
SET @sql= 'BACKUP DATABASE '+@DatabaseName+CHAR(13)+
'TO DISK='+'''P:\SQLDB_Backup\'+@DatabaseName+'\'+@DatabaseName+
'_'+@Timestamp+'.bak'''+CHAR(13)+' WITH FORMAT,Compression'
EXECUTE sp_executeSQL @sql