网站首页 > 基础教程 正文
概念
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脚本。
猜你喜欢
- 2024-10-10 Linux系统常用命令大全 linux系统常用命令大全详解
- 2024-10-10 Redis数据类型与常用指令示例 redis数据类型和用法
- 2024-10-10 深入理解Redis原理与应用,总结10个必定掌握要点,5分钟彻底看懂
- 2024-10-10 sqlserver数据库中的高级知识点有哪些?
- 2024-10-10 程序员的福音 - Apache Commons Exec
- 2024-10-10 Linux常用命令分类详解|文件搜索 linux命令分类总结
- 2024-10-10 linux性能工具perf工作原理简析 linux perl
- 2024-10-10 Python-调用系统命令或脚本,快速完成任务
- 2024-10-10 「Docker」命令使用大全,全集一览
- 2024-10-10 DOS常用命令集合 dos所有命令的命令格式
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)