1.前言
MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;
通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXEC沒有。
還有一個最大的好處就是利用sp_executesql,能夠重用執行計划,
這就大大提供了執行性能(對於這個我在后面的例子中會詳加說明),
還可以編寫更安全的代碼。EXEC在某些情況下會更靈活。
除非您有令人信服的理由使用EXEC,否側盡量使用sp_executesql.
2.EXEC的使用
EXEC命令有兩種用法,一種是執行一個存儲過程,另一種是執行一個動態的批處理。以下所講的都是第二種用法。
DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@Num INT; SET @TableName = 'wolf_example'; SET @Num = 20038; EXEC('SELECT * FROM ' + @TableName +' WHERE Num = '+ @Num +' ORDER BY Num DESC') --正常 SET @sql='SELECT * FROM ' + @TableName +' WHERE Num = '+ @Num +' ORDER BY Num DESC'; EXEC(@sql); --異常
3.sp_executesql的使用
DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@Num INT; SET @TableName = 'wolf_example'; SET @Num = 20038; SET @sql='SELECT * FROM ' + @TableName +' WHERE Num = '+ CAST(@Num as varchar(10)) +' ORDER BY Num DESC'; EXEC sp_executesql @sql; --正常
DECLARE @Sql NVARCHAR(MAX); DECLARE @ONum as INT; SET @Sql='SELECT @OutNum=num FROM wolf_example WHERE Num = @Num AND Name=@Name'; EXEC sp_executesql @Sql, N'@Num as INT,@Name as VARCHAR(50),@OutNum as INT OUTPUT', @Num = 20038, @Name= '11', @OutNum = @ONum OUTPUT SELECT @ONum