exec('select * from Student') exec sp_executesql N'select * from Student'--此處必定要加上N,不然會報錯
2.帶參數的SQL語句html
declare @sql nvarchar(1000) declare @userId varchar(100) set @userId='0001' set @sql='select * from Student where UserID='''+@userId+'''' exec(@sql)
declare @sql nvarchar(1000) declare @userId varchar(100) set @userId='0001' set @sql=N'select * from Student where UserID=@userId' exec sp_executesql @sql,N'@userId varchar(100)',@userId
從這個例子中能夠看出使用sp_executesql能夠直接將參數寫在sql語句中,而exec須要使用拼接的方式,這在必定程度上能夠防止SQL注入,所以sp_executesql擁有更高的安全性。另外須要注意的是,存儲sql語句的變量必須聲明爲nvarchar類型的。sql
3.帶輸出參數的SQL語句安全
create procedure [dbo].[sp_GetNameByUserId] ( @userId varchar(100), @userName varchar(100) output ) as begin declare @sql nvarchar(1000) set @sql=N'select @userName=UserName from Student where UserId=@userId' exec sp_executesql @sql,N'@userId varchar(100),@userName varchar(100) output',@userId,@userName output select @userName end
原文連接性能