0

0

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

絕刀狂花

絕刀狂花

发布时间:2025-07-22 10:30:01

|

796人浏览过

|

来源于php中文网

原创

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

在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字符串格式。这是上面脚本的输出:

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

若冰企业商务平台.net
若冰企业商务平台.net

集企业自助建站、网络营销、商品推广于一体的系统 功能说明: 1、系统采用Microsoft SQL Server大型数据库支持,查询数据库用的全是存储过程,速度和性能极好。开发环境是vs.net,采用4层结构,具有很好的可维护性和可扩冲性。 2、用户注册和登陆 未注册用户只具备浏览商品、新闻和留言功能;要采购商品,需接受服务协议并填写相关注册信息成为正式用户后方可进行,以尽可能减少和避免无效

下载

在现实生活中的数据库查询中,过滤器或条件由用户传递。例如,用户可以在特定搜索限制内搜索书籍。在这种情况下,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存储过程。这是输出:

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

输出显示价格大于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之间的记录,如下所示:

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

结论 (Conclusion)

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

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1096

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

358

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

697

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

418

2024.04.29

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.5万人学习

SQL优化与排查(MySQL版)
SQL优化与排查(MySQL版)

共26课时 | 2.3万人学习

MySQL索引优化解决方案
MySQL索引优化解决方案

共23课时 | 2.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号