SQL存储过程动态SQL执行技巧:EXEC与sp_executesql比较
创始人
2024-12-16 07:06:29
0 次浏览
0 评论
怎样SQL存储过程中执行动态SQL语句
执行动态Sql语句在存储过程中,MSSQL提供了两个命令来动态执行SQL语句;EXEC和sp_executesql;通常sp_executesql提供输入和输出接口;没有执行。另一个最大的好处是使用sp_executesql允许您重用执行计划;这极大地提高了执行性能并允许您编写安全的代码。
EXEC在某些情况下可以更加灵活。
除非您有充分的理由使用EXEC。
尝试使用sp_executesql.1有两种方法使用EXEC命令;一种是运行存储过程,另一种是运行动态批处理过程。
第二种用法如下。
然后使用EXEC显示示例代码1代码DECLARE@TableNameVARCHAR(50),@SqlNVARCHAR(MAX),@OrderIDINT;SET@TableName='Orders';SET@OrderID=10251;SET@sql='SELECT*FROM'+QUOTENAME(@TableName)+'WHEREOrderID='+CAST(@OrderIDASVARCHAR(10))+'ORDERBYORDERIDDESC'EXEC(@sql)注意:尽管此处EXEC括号中只允许使用单个字符串变量。
如果我们像这样编写EXECEXEC('SELECTTOP('+CAST(@TopCountASVARCHAR(10))+')*FROM'+)+。
'ORDERBYORDERIDDESC');SQL编译器会报错,编译不会跳过:EXEC(@sql+@sql2+@sql3);多变的然后用这个变量作为EXEC命令的输入参数;只有这样才不会受到限制。
EXEC的缺点是不提供接口无法执行包含变量符号的批处理。
@TableName='Orders';SET@OrderID=10251;SET@sql='SELECT*FROM'+QUOTENAME(@TableName)+'WHEREOrderID=@OrderIDORDERBYORDERIDDESC'EXEC(@sql);KEY位于SET@sql语句中,如果我们运行这个批次,来自编译器的错误Msg137;15级,它将在State2、Line1中发行。
声明标量变量“@OrderID”。
使用EXEC时如果你想访问一个变量;您必须将变量内容组合成一行动态构造的代码,例如SET@sql='SELECT*FROM'+QUOTENAME(@TableName)+'WHEREOrderID='+CAST。
(@OrderIDASVARCHAR(10))+'ORDERBYORDERIDDESC'关系变量的内容也存在性能缺点。
SQLServer为每个查询字符串创建一个新的执行计划。
查询模式是相同的。
为了证明这一点,首先清除缓存中的DBCCFREEPROCCACHE执行计划(本文不涉及,可以查看MSDN代码1三遍,设置以下三个值为@OrderID,10251,10252,10253。
然后SELECTcacheobjtype,objtype,usecounts,按F5查询sqlFROMsys.sqlNOTLIKE动态批处理也不支持输出参数返回例如下面的代码返回订单表中所有记录的条数。
DECLARE@sqlNVARCHAR='SELECTCOUNT(@sql);但是,如果要返回调用批处理的输出,则必须使用INSERTEXEC语法将输出插入到目标表中;然后从表中获取值并将其分配给一个变量,如下所示:代码DECLARE@sqlNVARCHAR(MAX),@RecordCountINTSET@sql='SELECTCOUNT(OrderID)FromOrders';CREATETABLE#T(TIDINT);INSERTINTO#TEXEC(@sql);SET@RecordCount=(SELECTTIDFROM#T)SELECT@RecordCountDROPTABLE#T22使用sp_executesqlsp_executesql命令的执行晚于SQLServer中的EXEC命令。
推出来,主要是为回收提供更好的支持。
。
为了与EXEC进行尖锐的比较,让我们看看是否使用代码1中的代码将EXEC替换为sp_executesql以获得所需的结果代码DECLARE@TableNameVARCHAR(50),@sqlNVARCHAR(MAX),@OrderIDINT,@sql2NVARCHAR(MAX);SET@TableName='订单';SET@OrderID=10251;SET@sql='SELECT*FROM'+QUOTENAME(@TableName)+'WHEREOrderID='+CAST(@OrderIDASVARCHAR(50))+'ORDERBYORDERIDDESC'EXECsp_executesql@sql关注最后一行;sp_executesql更灵活,因为它提供了一个接口。
它提供了一个接口,提供输入参数,也提供输出参数。
此功能允许您创建带有约束的查询字符串,以便sp_executesql的结构比executesql具有更好的可重用性,除非您是动态构建代码。
这包括:代码阻塞;由限制声明部分和限制设置部分组成。
经过一番交谈后,我们看一下它的语法:EXECsp_executesql@stmt=
@stmt参数是动态批量输入;可以引入输入参数或输出参数;它与存储过程的主语句相同,只是它是动态的。
sp_executesql;@params参数类似于指定输入/输出参数的存储过程标头,实际上存储过程标头@
存储过程。
实际上,@stmt和@params是可选的;execsp_executesql的语法可以缩写为以下格式:EXECsp_executesql
代码DECLARE@TableNameVARCHAR(50),@sqlNVARCHAR(MAX),@OrderIDINT;SET@TableName='订单';SET@OrderID=10251;SET@sql='SELECT*FROM'+@TableName+'WHEREOrderID=@OIDORDERBY'ORDERID;-当你想限制动态sql语句的表名时。
请注意,不能指定以下内容:--set@sql='select*from@TableNamewhereOrderID=@OIDORDERBYOrderiddesc';--如果它提示您申报。
标量变量@TableName;只能使用@TableName作为变量名来拼接上面写的EXECsp_execut。
esql@sql,N'@OIDint',@OID=@OrderID在调用execsp_executesql代码并检查其生成的执行计划之前;缓存中的处理计划清除它。
DBCCFREEPROCCACHE执行上述动态代码3次;每个函数都会为@OrderID分配不同的值,查询sys.syscacheobjects表,并集中其输出。
优化器只创建了一个替代程序,该程序是SELECTcacheobjtype,objtype,usecounts,sqlFROMsys.syscacheobjectsWHEREsqlNOTLIKE'%cache%'ANDsqlNOTLIKE'%sys.%'ANDsqlNOTLIKE'%sp'executesrunsq_executesql的另一项强大功能与其相关接口,就是可以使用输出参数来返回调用批处理中的变量值。
此功能避免使用临时表返回数据,从而提高代码效率并减少重新编译。
设置和使用输出参数的语法与存储过程类似。
那是,声明参数时需要指定OUTPUT子句。
例如,以下静态代码演示了如何使用动态批处理中的输出参数@p将值返回到外部变量@i.DECLARE@sqlASNVARCHAR(12),@iASINT;SET@sql=N'批处理SET@p=10';EXECsp_executesql@sql,N'@pASINTOUTPUT',@p=@iOUTPUTSELECT@i--此代码返回10个输出。
使用字母N来标识Unicode字符串常量,总结以下几点:1.使用excesp_executesql比同类型的效率更高。
声明只需编译一次,而exec执行后需要多次编译。
2.动态sql的where子句,也就是说,在构造条件从句时,执行要进行定位,需要将变量转换为字符串并与动态sql.连接进行比较,这可能会导致Sql注入问题,如下所示:SET@sql='SELECT*FROM'+QUOTENAME(@TableName)+'WHEREOrderID='+CAST(@OrderIDASVARCHAR(50))+'ORDERBYORDERIDDESC'如果与execsp_executesql可以使用变量来确定位置并将值传递给该参数来构建动态sq。
我要避免Sql注入问题,如下所示:SET@sql='SELECT*FROM'+@TableName+'WHEREOrderID=@OIDORDERBYORDERIDDESC'3.Exec或Execsp_executesql。
如果你想让表格和列移动,名称表名约束和列名约束不能用于定位;要使用exec参数,需要表名参数和列名参数。
对于p_executesql;表名参数和列名参数不能指定为execsp_executesql的参数声明部分中指定的参数。
示例:代码createPROCEDUREGetData@tbNamenvarchar(10),@colNamenvarchar(10),@NamenvarqBEGINcharne(10@vare)50);set@sql='select'+@colName+'from'+@tbName+'wherename=@whereName';--这句话不能写成如下注:-set@sql='select@colNamefrom@tbNamewherename=@whereName';execsp_executesql@sql,N'@whereNamenvarchar(10)',@nameEND

mybatisifwhere标签怎么使用
MyBatis中中性文本的使用
在MyBatisXML文件中,``和``标签是动态SQL语句的重要元素。
1.当指定的条件为真时,“标签”的内容将包含在最终生成的SQL语句中。
其基本语法如下:
xml
SELECT*FROMyour_tableWHEREcondition_column=#{value}
上例中,当传入参数满足`condition`m当条件发生时,`tag'内的SQL语句将被执行。
这样可以根据不同的条件动态生成不同的SQL语句。
2.更有组织性。
其基本用法如下:
xml
SELECT*FROMyour_tableANDcondition_column1=#{value1}ANDcondition_column2=#{value2}
在此示例中``标签将了解ET连接器的过程,当两个“`标签中的条件都不满足时,生成的SQL语句中的WHERE子句不会被省略,而是会更改为正确的形式。
这种语法避免了遗漏的错误同时,``tag''还可以与其他MyBatis标签结合使用来生成更复杂的动态SQL。
通过使用这两个标签,可以大大提高SQL语句的灵活性和可用性。
在实际开发中,根据具体需求选择合适的语言使用方法,可以提高MGE效率和代码质量。
上一篇:
SQL取整技巧汇总:5种常用取整方法详解
下一篇:
C语言编程:简单实现爱心图案,表白心意
相关文章

深入解析MySQL:数据库管理系统的核心...
2025-01-11 22:18:48
MySQL三重备份策略:全方位数据安全解...
2025-02-22 04:22:55
MySQL数据清空与删除表操作指南
2025-02-16 06:25:17
MySQL数据库文件存储位置解析
2025-01-10 08:05:27
SQL Server远程连接配置指南:轻...
2024-12-16 01:42:38
MySQL日期差异计算:高效方法解析月份...
2024-12-31 11:55:26
轻松掌握SQL:创建教师部门信息表与供应...
2024-12-30 02:48:25
MySQL数据库表创建与数据添加指南
2024-12-18 19:12:17
Windows 7 64位系统下安装 S...
2025-02-19 23:43:45
SQL Server服务启动失败?6步解...
2024-12-14 21:13:58最新文章
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
热门文章
1
高效掌握:CMD命令轻松启动、关闭及登录...
如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...
2
MySQL分区删除技巧与8.0版本新特性...
mysql删除分区在MySQL中,删除分区操作主要使用“可替代”的命令与“ dr...
3
Python代码实现:如何判断三角形的三...
python三角形三条边长,判断能否构成三角形Python三角形的三个长边如下:...
4
深度解析:MySQL查询语句执行顺序及优...
mysql查询语句执行顺序当这是由于执行SQL的过程时,了解其过程很重要。 ...
5
SQL教程:使用SUBSTRING和IN...
sql取特定字符的前面几位字符selectsubstr('L-0FCLDRBCT...
6
MySQL日期差异计算方法:轻松获取日期...
MySQL计算时间差两日期相减得月份mysql两时间相减得月MySQL计算时间之...
7
MySQL及SQL查询获取前10条数据方...
MySql查询前10条数据sql语句是从MySQL获取前1 0个数据的SQL查询...
8
MySQL启动问题排查与解决指南
Mysql为什么启动不了如果要配置MySQL,则遇到无法启动的问题,可能是由于配...
9
DbVisualizer添加MySQL数...
如何在DbVisualizer中添加本地mysql数据库由于DbVisualiz...
10
SQL字段默认值设置全攻略:轻松实现自动...
sql如何设置字段默认值设置SQL中某个字段的默认值;需要遵循几个步骤。首先您需...