mysql动态sql拼接_动态SQL(拼接)

动态SQL在MySQL中常用于根据条件拼接SQL语句,以解决WHERE子句中包含OR导致无法使用索引的问题。本文介绍了如何使用存储过程创建动态SQL,包括未拼接和拼接后的实现方式,并探讨了执行计划的影响。通过示例展示了动态SQL如何根据参数进行条件筛选,以提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q1:什么是动态SQL呢?

A1:首先是SQL语句,是根据条件来拼接SQL

Q2:为什么要用动态SQL?

A2:因为在条件WHERE中出现OR会导致不能使用索引,从而使效率差别巨大。

例如:如图1、2,

9f7005f8de323a3e11889a2828c202a3.png

图(1)

495f691d08883facee2148346bc7b98d.png

图(2)

Q3:怎么样使用动态SQL?

A3:

存储过程Proc_Test是没有采用拼接的:CREATE PROC Proc_Test

(

@姓名 varchar(10),

@课程 varchar(10),

@分数 int,

@总数 int output

)

AS

BEGIN

--取总数

SELECT @总数=COUNT(1)

FROM test

WHERE (@姓名='' or 姓名=@姓名)

AND (@课程='' or 课程=@课程)

AND (@分数='' or 分数>=@分数)

--取数据

SELECT *

FROM test

WHERE (@姓名='' or 姓名=@姓名)

AND (@课程='' or 课程=@课程)

AND (@分数=0 or 分数>=@分数)

END

拼接后可以改成Proc_Test1CREATE PROC Proc_Test1

(

@姓名 varchar(10),

@课程 varchar(10),

@分数 int,

@总数 int output

)

AS

BEGIN

declare @sqls1 nvarchar(max)

declare @sqls2 nvarchar(max)

declare @sqls3 nvarchar(max)

set @sqls1='

FROM test

WHERE ID>1'/*如果没有一定成立的条件就需要加1=1*/

IF @姓名<>''/*参数过滤*/

BEGIN

SET @sqls1=@sqls1+' AND 姓名='''+@姓名+''''/*AND前面要加空格*/

END

IF @课程<>''

BEGIN

SET @sqls1=@sqls1+' AND 课程='''+@课程+''''/*为了@课程加上引号,特别处理。三个引号:其中一个为引号,用于字符串表示,另外两个为引号的转义字符。*/

END

IF @分数>0

BEGIN

SET @sqls1=@sqls1+' AND 分数>='+cast(@分数 as nvarchar)/*非字符串参数要转换为字符串*/

END

--取总数

SET @sqls2='

SELECT @总数=COUNT(1)'+@sqls1

--取数据

SET @sqls3='

SELECT * '+@sqls1

exec sp_executesql @sqls2,N'@总数 int out',@总数 out/*语句前的N必不可少*/

exec (@sqls3)

END

执行计划:EXEC Proc_Test '','',0,0

EXEC Proc_Test1 '','',0,0

73ff9a32c8c3aebfb213272e0416f170.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值