SQL 执行存储过程之 [sp_executesql] - 重用SQL
SQL 执行存储过程之 [sp_executesql] - 重用SQL
执行可重复使用多次的Transact-SQL语句或批处理,或动态生成的语句或批处理。Transact-SQL语句或批处理可以包含嵌入参数。
1 2 3 4 5 | sp_executesql [ @stmt = ] statement [ { , [ @params = ] N '@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' } { , [ @param1 = ] 'value1' [ ,...n ] } ] |
参数:
- [@stmt=] statement
- 是包含Transact-SQL语句或批处理的Unicode字符串@stmt必须是Unicode常量或Unicode变量。不允许使用更复杂的Unicode表达式,例如使用+运算符连接两个字符串。不允许使用字符常量。如果指定了Unicode常量,则它必须以N作为前缀。例如,Unicode常量N'sp_who'有效,但字符常量'sp_who'无效。字符串的大小仅受可用数据库服务器内存的限制。在64位服务器上,字符串的大小限制为2 GB,即nvarchar的最大大小(max)。
- @stmt中包含的每个参数在@params参数定义列表和参数值列表中都必须有相应的条目。
- [@params=]N'@parameter_name data_type[,…N]'
- 是一个字符串,包含@stmt中嵌入的所有参数的定义。字符串必须是Unicode常量或Unicode变量。每个参数定义由一个参数名和一个数据类型组成。n是表示其他参数定义的占位符。@stmt中指定的每个参数都必须在@params中定义。如果@stmt中的Transact-SQL语句或批处理不包含参数,则不需要@params。此参数的默认值为NULL。
- [@param1=]'value1'
- 是参数字符串中定义的第一个参数的值。该值可以是Unicode常量或Unicode变量。必须为@stmt中包含的每个参数提供一个参数值。当@stmt中的Transact-SQL语句或批处理没有参数时,这些值不是必需的。
- [ OUT | OUTPUT ]
- 指示该参数是输出参数。text、ntext和image参数可以用作输出参数,除非该过程是公共语言运行时(CLR)过程。使用output关键字的输出参数可以是光标占位符,除非该过程是CLR过程。
- n
- 是其他参数值的占位符。值只能是常量或变量。值不能是更复杂的表达式,如函数或使用运算符生成的表达式。
返回值:0成功 ,非0 失败
其他注意事项:
- sp_executesql参数必须按照本主题前面“语法”部分所述的特定顺序输入。如果输入的参数顺序不正确,将出现错误消息。
- sp_executesql在批处理、名称范围和数据库上下文方面的行为与EXECUTE相同。在执行sp_executesql语句之前,不会编译sp_executesql@stmt参数中的Transact-SQL语句或批处理。然后将@stmt的内容编译并作为一个执行计划执行,该执行计划与名为sp_executesql的批处理的执行计划分开。sp_executesql批处理无法引用在调用sp_executesql的批处理中声明的变量。sp_executesql批处理中的本地游标或变量对调用sp_executesql的批处理不可见。数据库上下文中的更改只持续到sp_executesql语句的末尾。
- 当对Transact-SQL语句的参数值的更改是唯一的变化时,可以使用sp_executesql代替存储过程多次执行该语句。由于Transact-SQL语句本身保持不变,并且只有参数值会更改,因此SQL Server查询优化器可能会重用它为第一次执行生成的执行计划。
示例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | use TaoRoy2022; go declare @sSQL nvarchar(500); declare @Parm1 nvarchar(500); declare @SaNum nvarchar(25); declare @InVar int ; set @sSQL = N 'select @SaOUT = max(SaNum) from Sales.SaHer where CuID = @CuID' ; set @Parm1 = N '@CuID int,@SaOUT nvarchar(25) output' ; set @InVar = 5201314; execute sp_executesql @sSQL ,@Parm1 ,@CuID = @InVar ,@SaOUT = @SaNum output ; select @SaNum; -- 此select语句返回输出参数的值。 -- 此select语句使用where子句中输出参数的值。 select sDate,sTotal from Sales.SaHer where SaNum=@SaNum; |
示例2:
1 2 3 4 5 6 7 8 9 10 11 12 | create procedure [dbo].[sp_GetUId] ( @uId varchar (100), @uName varchar (100) output ) as begin declare @sql nvarchar(1000) set @sql=N 'select @uName=UName from TB1 where UId=@uId' exec sp_executesql @sql,N '@uId varchar(100),@uName varchar(100) output' ,@uId,@uName output select @uName end |
创建时间:2022.01.26 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?