[SQL] [效能] sp_executesql

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