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  更新时间:

posted on   滔Roy  阅读(915)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

点击右上角即可分享
微信分享提示