【问题标题】:SQL Server Stored Procedure expects parameter, which was not suppliedSQL Server 存储过程需要未提供的参数
【发布时间】:2013-05-09 07:31:53
【问题描述】:
CREATE   PROCEDURE dbo.SP_GUILD_CHAR_CREATE 
    @i_guild_code           VARCHAR(10)     ,   --길드코드
    @i_character_name       VARCHAR(40)     ,   --캐릭터명
    @i_peerage_code         VARBINARY(1)    ,   --작위코드
    @o_sp_rtn               INT     OUTPUT  ,   --실행결과
             @2mx_user_no           varchar(50)

AS
DECLARE 
    @v_max_char_cnt         int,        --한길드당 최대 길드원 수
    @v_row_cnt              int
BEGIN   
    SET NOCOUNT ON
    SET @o_sp_rtn = -1
    SET @v_max_char_cnt = 50

    --입력값 검증
    IF  @i_guild_code IS NULL       OR 
        @i_character_name IS NULL   OR
        @i_peerage_code IS NULL     BEGIN
        SET NOCOUNT OFF
        SET @o_sp_rtn = -1
        RETURN
    END

    --길드중복가입 검사.
    IF EXISTS(  SELECT  1
                FROM    dbo.GUILD_CHAR_INFO WITH(NOLOCK)
                WHERE   character_name = @i_character_name )
    BEGIN
        SET NOCOUNT OFF
        SET @o_sp_rtn = -2
        RETURN
    END

    --한길드당 최대 길드원 수 검증
    SELECT  @v_row_cnt = count(*)
    FROM    dbo.GUILD_CHAR_INFO WITH(NOLOCK)
    WHERE   guild_code = @i_guild_code 
    IF @@Error <> 0 BEGIN
        SET NOCOUNT OFF
        SET @o_sp_rtn = -3
        RETURN
    END

    IF @v_max_char_cnt <= @v_row_cnt BEGIN
        SET NOCOUNT OFF
        SET @o_sp_rtn = -4
        RETURN
    END

    --길드원 등록

SET @2mx_user_no = (SELECT user_no FROM user_character 
WHERE character_name = @i_character_name)

    BEGIN TRAN
    INSERT INTO dbo.GUILD_CHAR_INFO
          (
            guild_code          ,
            character_name      ,
            peerage_code        ,
            ipt_time            ,
            upt_time                           ,
                                        user_no             
          )
    VALUES(
            @i_guild_code           ,
                                        @2mx_user_no        ,
            @i_character_name               ,
            ISNULL(CAST(@i_peerage_code AS smallint), 9)        ,
            getdate()                       ,
            getdate()
          )
    IF @@Error <> 0 
    BEGIN
        ROLLBACK TRAN
        SET NOCOUNT OFF
        SET @o_sp_rtn = -9
        RETURN 
    END

COMMIT TRAN
SET NOCOUNT OFF
SET @o_sp_rtn = 0
END
GO

存储过程出错:

SQL 存储过程需要参数,但未提供。

我收到了这个错误,我真的不明白它出了什么问题。请尽量详细。

我不知道哪个参数没有提供,我应该如何修复它

【问题讨论】:

  • 你能贴出你用来调用这个存储过程的代码吗?
  • SQl Server 有一个称为 Profiler 的东西,它将捕获执行 proc 的 sql 调用。我假设大多数数据库都有他们可以使用的某种类型的分析应用程序。如果您捕获执行 proc 的请求,您可能会立即看到磨损的情况。
  • 大卫提出了正确的问题,但我会冒险猜测。可能未提供 OUT 参数。但是错误消息不会指定缺少哪个参数吗?您使用的是什么版本的 SQL Server?
  • 如果你使用“原始”ADO.NET 来调用它,我猜你错过了 command.CommandType = CommandType.StoredProcedure; 分配给你的SqlCommand ...

标签: sql-server tsql


【解决方案1】:

您的存储过程需要五个参数:

  1. @i_guild_code VARCHAR(10)
  2. @i_character_name VARCHAR(40)
  3. @i_peerage_code VARBINARY(1)
  4. @o_sp_rtn INT 输出
  5. @2mx_user_no varchar(50)

程序没有为它们提供默认值。您的调用代码必须在其 sql 命令中提供这些参数。

如果您从 .NET 类调用它,则应确保所有参数都包含在 SqlCommand 中。这是一个相关的问题:

What's the best method to pass parameters to SQLCommand?

一定要设置SqlParameter的.Direction属性

如果您直接使用 sql 脚本运行它们,则需要在执行调用后显式包含参数。有关示例,请参见 MSDN Article。

【讨论】:

  • 在你的调用代码中,确保你设置了.Direction属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多