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

时间:2016-12-19 15:16:51

标签: sql sql-server

这是我的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

再次对不起,我只是复制粘贴所有代码而不先看它,上面是实际的代码,我很抱歉这个混淆......

4 个答案:

答案 0 :(得分:1)

看起来您提供的参数顺序与您声明的顺序不同。选择在Name之前声明,但是在执行过程时首先提供Name。另外,您不希望您的更新语句说“code = @choice”吗?局部变量未定义且不需要。

答案 1 :(得分:0)

我得出的结论是,如果其中一个分支不使用所有参数,则无法组合分支存储过程。

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

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

strftime

用于更新,删除和显示程序:

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

分支1 [更新]

00001, Laptop, 5

结果:

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

分支2 [删除]

OtherProcedure 1, 'Laptops', 10, 00001

分支3 [显示]

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

答案 2 :(得分:0)

对于Microsoft SQL Server

对于您的问题: (请勿使用sp前缀)和(@code不是参数,因此我们无法传递值,它是局部变量) 如果您在使用IF时遇到问题,则将@code用作参数,但在需要时传递null值,然后执行该null检入过程。

请参见下文分配值:

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

答案 3 :(得分:-1)

首先,你的变量@Stock不会返回十进制,因为它是INT变量,你可以尝试浮点或其他东西。这就是为什么如果你给它“15,2”

它会显示错误的原因
WHERE Code = @Code

由于您未正确设置该变量,因此导致了0行受影响。 您必须为其分配有效值。