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
原文连接性能