传递存储过程的参数

时间:2018-04-26 13:54:18

标签: sql sql-server stored-procedures

我有这个存储过程:

CREATE PROCEDURE [Test]
    (@ID INT,
     @month VARCHAR(10),
     @Low INT,
     @standard FLOAT = 0)
AS
    IF EXISTS (SELECT 1 FROM [Table1] 
               WHERE ID = @ID AND month = @month 
                 AND TYPE = 'S' AND TYPEID = @Low)
    BEGIN
        UPDATE [Table1] 
        SET Add = @standard
        WHERE ID = @ID AND month = @month 
          AND TYPE = 'S' AND TYPEID = @Low
    END
    ELSE
    BEGIN
        INSERT INTO [Table1] (ID, month, Add, TYPE, TYPEID) 
        VALUES (@ID, @month, @standard, 'S', @Low)
    END
GO

这是缺少三月日期的表

ID     Month    Add    Type    TypeID
---------------------------------------
333    feb      4       S        111
333    April    4       S        111

所以我想通过刷新存储过程,这将填补3月份。

但是当我使用

执行程序时
Use [DB1]
GO

DECLARE @RV int
DECLARE @ID int
DECLARE @month varchar(10)
DECLARE @Low int
DECLARE @Add int
DECLARE @standard float

EXECUTE @RV = [Test] 
              @ID int,
              @month varchar(10),
              @Low int,
              @Add int,
              @standard float
GO

我得到了

  ID        Month      Add        Type     TypeID
  -----------------------------------------------
  333       feb         4           S        111
  333       April       4           S        111
  NULL      NULL        NULL        S        NULL

虽然我在寻找

  ID        Month      Add        Type      TypeID
  ------------------------------------------------
  333       feb         4           S        111
  333       April       4           S        111
  333       Mar         4           S        111

我假设我没有正确传递参数或其他东西。任何人都可以就此提出建议吗?感谢

1 个答案:

答案 0 :(得分:3)

您声明要将参数传递到存储过程,但是您没有在任何地方为它们分配值,因此该过程无法使用。

您需要将执行语句更改为以下内容:

Use [DB1]
GO
DECLARE @RV int = 0;
DECLARE @ID int = 333;
DECLARE @month varchar(10) = 'Mar';
DECLARE @Low int = 111;
DECLARE @Add int = 4;
DECLARE @standard float = 4;

EXECUTE @RV = [Test] 
@ID = @ID,
@month = @month,
@Low = @Low,
@Add = @Add,
@standard = @standard;
GO

将0和1.0替换为想要使用的值。

此外,month是表格中的字符串列,但您将INT传递给该过程。您需要更改@month参数以匹配表列的数据类型。
(在编辑后删除)