更新新信息的程序

时间:2015-01-19 15:59:07

标签: sql-server sql-update procedure

所以我一直致力于学校的简单程序,要求我:

(创建一个名为UpdateProduct的存储过程,它接受所需的Product ID参数以及Product表中的任何其他一个或多个字段。然后proc将更新传入的任何字段,但保留其他任何字段。< / p>

  1. 如果执行如下:UpdateProduct @productID = 1,@ name ='Steel Ball Bearing';只有名称应该更改,所有其他字段仍应包含该过程之前的值 被称为)
  2. 这就是我所拥有的,但我似乎无法让它正常工作。我疯了,因为我一直试图解决这个问题好几天。任何指出我的错误的帮助都会很棒。

    USE AdventureWorks2012
    GO
    
    CREATE PROC UpdateProduct2
    @ProductID INT ,
    @Name nvarchar (50)= ISNULL,
    @ProductNumber nvarchar (25) =ISNULL,
    @Color nvarchar (15)=ISNULL
    
    AS 
    BEGIN
    UPDATE [Production].[Product] 
    SET
    Name = ISNULL (@Name,Name),
    ProductNumber = ISNULL (@ProductNumber,ProductNumber),
    Color = ISNULL (@Color, Color)
    WHERE @Name=Name
    
    
    END
    

1 个答案:

答案 0 :(得分:1)

我认为你的where子句应该是:

WHERE   ProductID = @ProductID; 

而不是

WHERE @Name=Name

此外,您需要使用NULL而不是ISNULL来设置参数默认值:

CREATE PROC UpdateProduct2
    @ProductID int,
    @Name nvarchar(50) = NULL,
    @ProductNumber nvarchar(25) = NULL,
    @Color nvarchar(15) = NULL

AS 
BEGIN
    UPDATE [Production].[Product] 
    SET     Name = ISNULL (@Name,Name),
            ProductNumber = ISNULL (@ProductNumber,ProductNumber),
            Color = ISNULL (@Color, Color)
    WHERE   ProductID = @ProductID; 
END

修改

要回答有关将NULL指定为默认值的问题,是的,有一个原因,它允许您在不传递参数的情况下调用该过程。

采取以下两个程序:

CREATE PROCEDURE dbo.P1 @p1 VARCHAR(20), @p2 VARCHAR(20)
AS
BEGIN
    SELECT P1 = @p1, P2 = @p2;
END;
GO
CREATE PROCEDURE dbo.P2 @p1 VARCHAR(20) = NULL, @p2 VARCHAR(20) = NULL
AS
BEGIN
    SELECT P1 = @p1, P2 = @p2;
END;

第一个使用no default,后者使用NULL作为默认值。调用第一个过程的唯一方法是发送所有参数,例如

EXECUTE dbo.p1;
EXECUTE dbo.p1 @P2 = 'TEST';
EXECUTE dbo.p1 @P1 = 'TEST';

会产生以下错误:

Msg 201, Level 16, State 4, Procedure P1, Line 0
Procedure or function 'P1' expects parameter '@p1', which was not supplied.
Msg 201, Level 16, State 4, Procedure P1, Line 0
Procedure or function 'P1' expects parameter '@p1', which was not supplied.
Msg 201, Level 16, State 4, Procedure P1, Line 0
Procedure or function 'P1' expects parameter '@p2', which was not supplied.

鉴于此:

EXECUTE dbo.p2;
EXECUTE dbo.p2 @P2 = 'TEST';
EXECUTE dbo.p2 @P1 = 'TEST';

将生成:

P1      P2
NULL    NULL

P1      P2
NULL    TEST

P1      P2
TEST    NULL