【问题标题】:sp_executesql bug?sp_executesql 错误?
【发布时间】:2012-06-17 03:40:13
【问题描述】:

为什么在使用 sp_executesql 调用存储过程时出现错误?

不起作用。

exec sp_executesql N'sp_clnt_regional_experts_territories',
                   N'@action nvarchar(3), @regional_expert_id int,@region_id int,@territory_id int',
                   @action = N'SEL',
                   @regional_expert_id = 2,
                   @region_id = -1,
                   @territory_id = -1

程序或函数“sp_clnt_regional_experts_territories”期望 未提供参数“@action”。

工作正常:

EXEC sp_clnt_regional_experts_territories                   
     @action = N'SEL',
     @regional_expert_id = 2,
     @region_id = -1,
     @territory_id = -1

存储过程在哪里:

ALTER PROCEDURE [dbo].[sp_clnt_regional_experts_territories]
    @action NVARCHAR(3),
    @regional_expert_id INT = -1,
    @region_id INT = -1,
    @territory_id INT = -1

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    你的 sp_executesql 错误。你需要像下面这样格式化它

     DECLARE @SQLString NVARCHAR(500)
     DECLARE @ParmDefinition NVARCHAR(500)
     DECLARE @action nvarchar(3)
     DECLARE @regional_expert_id int
     DECLARE @region_id int
     DECLARE @territory_id INT
     Set @SQLString=N'EXEC sp_clnt_regional_experts_territories @action,
                                                 @regional_expert_id ,@region_id   ,@territory_id'
    
     Set @ParmDefinition='@action NVARCHAR(3),
                @regional_expert_id INT ,
                @region_id INT ,
                @territory_id INT '
    
    EXECUTE sp_executesql
    @SQLString,
    @ParmDefinition,
    @action=N'SEL',
    @regional_expert_id=2,
    @region_id=-1,
    @territory_id=-1
    

    与其直接在一个语句中输入所有内容,不如将代码分解成不同的部分,这有助于您轻松找到问题。

    【讨论】:

    • 那很好。你的 sql profiler 不会为用户剖析这些代码。我实际上的意思是您应该以上述方式编写代码,这有助于提高可读性。无论如何,您没有正确传递参数
    • @user1455361 - 如果 SQL Profiler 向您显示该语句,请确保您的应用程序将 CommandType 设置为 StoredProcedure 而不是 Text
    【解决方案2】:

    错误是因为您没有在存储过程名称后面包含参数,这是 sp_executesql 所要求的

    exec sp_executesql N'sp_clnt_regional_experts_territories @action,@regional_expert_id ,@region_id   ,@territory_id',
                       N'@action nvarchar(3), @regional_expert_id int,@region_id int,@territory_id int',
                       @action = N'SEL',
                       @regional_expert_id = 2,
                       @region_id = -1,
                       @territory_id = -1
    

    【讨论】:

      【解决方案3】:

      sp_executesql 谈到@params

      是一个字符串,其中包含嵌入@stmt 中的所有参数的定义。

      (已添加重点)

      因此,正如其他答案所指出的那样,您在 @stmt 中也必须提到您在那里识别的任何参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-16
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        相关资源
        最近更新 更多