概念
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重新执行计划,这就大大提供了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否则尽量使用sp_executesql。
区别
sp_executesql为系统提供存储过程,可将参数写在sql语句中,而exec需要使用拼接的方式,这在一定程度上可以防止SQL注入,因此sp_executesql拥有更高的安全性。另外需要注意的是,存储sql语句的变量必须声明为nvarchar类型的。
下面我们来用两个实例来体现他们的区别:
--创建表
CREATE TABLE userinfo
(
userid INT IDENTITY(1,1) PRIMARY KEY, --用户ID
username NVARCHAR(50) NOT NULL --用户姓名
)
GO
--插入测试数据
INSERT INTO userinfo(username) VALUES('张三')
INSERT INTO userinfo(username) VALUES('李四')
INSERT INTO userinfo(username) VALUES('王五')
下面通过分别通过exec和sp_executesql方法来实现动态加载sql脚本,来看看他们区别
exec方法
--查询标号为2的用户信息
DECLARE @strSql NVARCHAR(MAX)
DECLARE @userID NVARCHAR(10)
SET @userID='2'
SET @strSql=N'select * from userinfo where userid='''+@userID+''''
EXEC(@strSql)
sp_executesql方法
--查询标号为2的用户信息
DECLARE @strSql NVARCHAR(MAX)
DECLARE @userID NVARCHAR(10)
SET @userID='2'
SET @strSql='select * from userinfo where userid=@userID'
EXEC sys.sp_executesql @strSql,N'@userID NVARCHAR(10)',@userID
通过上面两段代码我们容易发现,使用exec方法查询带参数语句需要对参数进行字符串拼接,而sp_executesql方法可以支持参数的输入和输出。个人建议没有特殊的情况,尽量用系统自带的sp_executesql方法来动态加载sql脚本。
本文来自季末投稿,不代表胡巴网立场,如若转载,请注明出处:https://www.hu85.com/103225.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 xxxxx@qq.com 举报,一经查实,本站将立刻删除。