• SQL 执行存储过程之 [sp_executesql] 重用SQL


    SQL 执行存储过程之 [sp_executesql] - 重用SQL

      执行可重复使用多次的Transact-SQL语句或批处理,或动态生成的语句或批处理。Transact-SQL语句或批处理可以包含嵌入参数。

    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:

    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:

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

  • 相关阅读:
    Vue插件配置和 后台交互
    Vue项目环境搭建
    数据结构之链表
    数据结构之线性表顺序结构
    leetcode-- Longest Common Prefix
    数据结构之拓扑排序
    数据结构之shell排序
    数据结构之插入排序
    leetcode
    leetcode
  • 原文地址:https://www.cnblogs.com/guorongtao/p/15845596.html
Copyright © 2020-2023  润新知