执行时如何在存储过程变量中赋值?

新手上路,请多包涵

这是我的 SQL 代码

CREATE PROC sp_procedure
     (@Name VARCHAR(50),
      @Stock numeric)
AS
    DECLARE @Code CHAR(4)
BEGIN
    UPDATE tbProcedure
    SET Name = @Name, Stock = @Stock
    WHERE Code = @Code

    SELECT * FROM tbProcedure
END

然后我像这样执行代码

EXEC sp_procedure 'Name',15,2

然后我得到错误结果说指定的参数太多。

我也试过这个

EXEC sp_procedure 'Name',15

它不会返回错误,但会影响 0 行。

我想在执行存储过程时分配 @Code 值,甚至可以这样做吗?

编辑:

抱歉,它实际上是 CHAR(4) ,而不是 INT

再次抱歉,我只是复制粘贴所有代码,没有先看它,上面是实际代码,非常抱歉造成混淆……

原文由 Ein Hazard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 468
2 个回答

我得出的结论是,如果其中一个分支不使用所有参数,就不可能合并分支存储过程。

正因为如此,我编写了 2 个存储过程,下面是我的完整代码:

对于插入过程:[这是使用变量的过程]

 CREATE PROC InsProcedure
     (@Name VARCHAR(50),
      @Stock numeric)
AS
    DECLARE @CODE INT
    DECLARE @CODE2 CHAR(4)

BEGIN
    // Creating custom auto number
    SET @CODE = 0

    SELECT @CODE = ISNULL(MAX(CAST(KodeBarang AS INT)), 0)
    FROM tbProcedure

    SET @CODE2 = @CODE + 1
    SET @CODE2 = REPLICATE('0', 4 - LEN(@CODE2)) + @CODE2
    // End Custom auto number

    INSERT INTO tbProcedure VALUES(@CODE2, @Name, @Stock)

    SELECT * FROM tbProcedure
END

对于更新、删除和显示过程:

 CREATE PROC OtherProcedure
     (@choice int, // this is for branching option later
      @Code CHAR(4),
      @Name VARCHAR(50),
      @Stock numeric)
AS
    IF @choice = 1
    BEGIN
        UPDATE tbProcedure
        SET Name = @Name, Stock = @Stock
        WHERE Code = @Code

        SELECT * FROM tbProcedure
    END
    ELSE IF @choice = 2
        DELETE FROM tbProcedure
        WHERE KodeBarang = @Code
    ELSE
        SELECT * FROM tbProcedure

并使用这样的程序:

 InsProcedure 'Laptop', 5

结果:

 00001, Laptop, 5

分支 1 [更新]

 OtherProcedure 1, 'Laptops', 10, 00001

结果:

  • 之前:00001,笔记本电脑,5
  • 之后:00001,笔记本电脑,10

分支 2 [删除]

 OtherProcedure 2, '', 0, 00001     // Delete record where Code is '00001'

分公司 3 [显示]

 OtherProcedure 3, '', 0, 0     // You can also use any number besides 3

原文由 Ein Hazard 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于 Microsoft SQL 服务器

对于您的问题:(不要使用 sp 前缀)和(@code 不是参数,因此我们无法传递值,它是局部变量)如果您对 IF 有一些问题,请将 @code 作为参数但传递空值在需要时进行空值检查程序。

请参阅下文以分配值:

 USE [databasename]
GO

DECLARE @return_value int

EXEC    @return_value = <procedurename>
        @stringvariable = N'<stringvalue>',
        @Flag = <integervalue>

SELECT  'Return Value' = @return_value (return value if any)

GO

原文由 Abhishek J Patel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进