使用sp_executesql存储过程执行动态SQL查询

发布时间 - 2025-07-22 00:00:00    点击率:

大家好,又见面了,我是你们的朋友全栈君。

在SQL Server中,sp_executesql存储过程用于执行动态SQL查询。动态SQL查询是以字符串格式存在的查询。在多种情况下,您可能需要处理字符串形式的SQL查询。

例如,如果用户想要通过名称搜索产品,他会在网站的搜索框中输入产品名称。产品名称是以字符串形式存在的,将与SELECT查询拼接成另一个字符串。这些类型的查询需要动态执行,因为不同用户会搜索不同的产品名称,因此根据产品名称需要动态生成查询。

现在您了解了动态SQL是什么,让我们看看如何使用sp_executesql存储过程来执行动态SQL查询。

首先,我们创建一些虚拟数据,用于执行本文中的示例。

创建虚拟数据 (Creating dummy data)

以下脚本创建一个名为BookStore的虚拟数据库,其中包含一个名为Books的表。Books表有四列:id、name、category和price:

CREATE Database BookStore;
GO
USE BookStore;
CREATE TABLE Books(
    id INT,
    name VARCHAR(50) NOT NULL,
    category VARCHAR(50) NOT NULL,
    price INT NOT NULL
)

现在让我们在Books表中添加一些虚拟记录:

USE BookStore
INSERT INTO Books    
VALUES(1, 'Book1', 'Cat1', 1800),
      (2, 'Book2', 'Cat2', 1500),
      (3, 'Book3', 'Cat3', 2000),
      (4, 'Book4', 'Cat4', 1300),
      (5, 'Book5', 'Cat5', 1500),
      (6, 'Book6', 'Cat6', 5000),
      (7, 'Book7', 'Cat7', 8000),
      (8, 'Book8', 'Cat8', 5000),
      (9, 'Book9', 'Cat9', 5400),
      (10, 'Book10', 'Cat10', 3200)

上面的脚本在Books表中添加了10条虚拟记录。

使用sp_executesql存储过程 (Working with the sp_executesql stored procedure)

如前所述,sp_executesql存储过程用于执行字符串形式的动态SQL查询。让我们看看实际情况。

运行以下脚本:

DECLARE @SQL_QUERY NVARCHAR(128)
SET @SQL_QUERY = N'SELECT id, name, price FROM Books WHERE price > 4000 '
EXECUTE sp_executesql @SQL_QUERY

在上面的脚本中,我们声明了一个变量@SQL_QUERY,并用一个字符串查询对其进行初始化,该查询从Books表中返回价格大于4,000的id、名称和价格。

接下来,我们通过EXECUTE命令执行sp_executesql存储过程。要执行字符串格式的动态SQL查询,只需将包含查询的字符串传递给sp_executesql查询即可。

值得注意的是,在sp_executesql存储过程执行该字符串之前,该字符串应为Unicode格式。这就是我们在包含@SQL_QUERY变量的字符串开头放置'N'的原因。'N'将查询字符串转换为Unicode字符串格式。这是上面脚本的输出:

在现实生活中的数据库查询中,过滤器或条件由用户传递。例如,用户可以在特定搜索限制内搜索书籍。在这种情况下,SELECT查询保持不变,只改变WHERE条件。将WHERE子句存储在单独的字符串变量中,然后将SELECT条件与WHERE子句连接起来以创建最终查询是很方便的。在下面的示例中显示:

DECLARE @CONDITION NVARCHAR(128)
DECLARE @SQL_QUERY NVARCHAR (MAX)
SET @CONDITION = 'WHERE price > 5000'
SET @SQL_QUERY = N'SELECT id, name, price FROM Books ' + @CONDITION
EXECUTE sp_executesql @SQL_QUERY

在上面的脚本中,我们声明了两个变量:@CONDITION和@SQL_QUERY。@CONDITION变量包含字符串格式的WHERE子句,而@SQL_QUERY包含SELECT查询。接下来,将这两个变量连接起来并传递给sp_executesql存储过程。这是输出:

输出显示价格大于5,000的所有书籍。

将参数传递给sp_executesql存储过程 (Passing parameters to sp_executesql stored procedure)

您还可以将参数传递给sp_executesql存储过程。当您在运行时不知道用于过滤记录的值时,这特别方便。要执行带有参数的sp_executesql存储过程,您需要执行以下步骤:

首先,您需要创建一个变量,该变量将存储参数列表。接下来,在查询字符串中,您需要传递参数名称。最后,您需要将查询、包含参数列表的变量以及实际参数及其值传递给sp_executesql存储过程。看下面的例子:

DECLARE @CONDITION NVARCHAR(128)
DECLARE @SQL_QUERY NVARCHAR (MAX)
DECLARE @PARAMS NVARCHAR (1000)
SET @CONDITION = 'WHERE price > @LowerPrice AND price < @HigherPrice'
SET @SQL_QUERY = N'SELECT id, name, price FROM Books ' + @CONDITION
SET @PARAMS = N'@LowerPrice INT, @HigherPrice INT'
EXECUTE sp_executesql @SQL_QUERY, @PARAMS, @LowerPrice = 3000, @HigherPrice = 6000

在上面的脚本中,我们创建了三个变量:@CONDITION、@SQL_QUERY和@PARAMS。@PARAMS变量是一个变量,它存储将在字符串查询格式中使用的参数列表。

如果您查看@CONDITION变量的值,它包含一个带有两个参数的WHERE子句:@LowerPrice和@HigherPrice。要在字符串查询中指定参数,您只需在参数名称前加上'@'运算符即可。在这里,@LowerPrice参数用于设置书籍价格的下限,而@HigherPrice设置BookStore表的price列中的值的上限。

接下来,在执行sp_executesql存储过程时,包含字符串查询的@SQL_QUERY变量与包含参数列表的@PARAMS变量一起传递。参数名称即@LowerPrice和@HigherPrice也分别与值3,000和6,000一起传递到sp_executesql存储过程。在输出中,您将看到价格在3,000到6,000之间的记录,如下所示:

结论 (Conclusion)

本文介绍了用于执行动态SQL查询的sp_executesql存储过程的功能。本文展示了如何通过sp_executesql存储过程以字符串形式执行SELECT查询。您还看到了如何将参数传递给sp_executesql存储过程,以便在运行时传递值的查询。

发布者:全栈程序员栈长,转载请注明出处:https://www./link/d95c6aef0aede9da6da41723b5ab4279


# red  # sql  # html  # 运算符  # select  # 字符串  #   # 值传递  # 数据库  # https  # 存储过程  # 子句  # 您需要  # 让我们  # 在上面  # 这是  # 您还  # 创建一个  # 的是  # 是一个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python3.6正式版新特性预览  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Python函数文档自动校验_规范解析【教程】  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Python制作简易注册登录系统  高性能网站服务器配置指南:安全稳定与高效建站核心方案  佛山网站制作系统,佛山企业变更地址网上办理步骤?  🚀拖拽式CMS建站能否实现高效与个性化并存?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何快速搭建安全的FTP站点?  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  香港服务器如何优化才能显著提升网站加载速度?  百度浏览器如何管理插件 百度浏览器插件管理方法  如何制作一个表白网站视频,关于勇敢表白的小标题?  音响网站制作视频教程,隆霸音响官方网站?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何在Ubuntu系统下快速搭建WordPress个人网站?  黑客如何利用漏洞与弱口令入侵网站服务器?  js实现获取鼠标当前的位置  如何在阿里云高效完成企业建站全流程?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Linux系统命令中tree命令详解  如何在腾讯云服务器上快速搭建个人网站?  如何在Windows环境下新建FTP站点并设置权限?  如何将凡科建站内容保存为本地文件?  简单实现Android验证码  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Android自定义listview布局实现上拉加载下拉刷新功能  如何用VPS主机快速搭建个人网站?  香港服务器租用每月最低只需15元?  如何用PHP快速搭建高效网站?分步指南  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Mybatis 中的insertOrUpdate操作  微信小程序 wx.uploadFile无法上传解决办法  Android GridView 滑动条设置一直显示状态(推荐)  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  深入理解Android中的xmlns:tools属性  网站建设保证美观性,需要考虑的几点问题!