所以我一直致力于学校的简单程序,要求我:
(创建一个名为UpdateProduct的存储过程,它接受所需的Product ID参数以及Product表中的任何其他一个或多个字段。然后proc将更新传入的任何字段,但保留其他任何字段。< / p>
这就是我所拥有的,但我似乎无法让它正常工作。我疯了,因为我一直试图解决这个问题好几天。任何指出我的错误的帮助都会很棒。
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
答案 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