更新新信息的程序
Procedure with update new information
所以我一直在为学校制定简单的程序,要求我:
(创建一个名为 UpdateProduct 的存储过程,该过程接收必需的产品 ID 参数以及可选的产品中的任何其他一个或多个字段 table。然后该过程将更新传入的任何字段,但保留任何其他字段原样。
- 如果这样执行:UpdateProduct @productID = 1, @name = ‘Steel Ball Bearing’;只有名称应该更改,所有其他字段仍应包含程序之前的值
被调用)
这就是我所拥有的,但我似乎仍然无法让它正常工作。我快疯了,因为几天来我一直在努力解决这个问题。任何指出我的错误的帮助都会很棒。
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
我认为你的 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;
前者不使用默认值,后者使用 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
所以我一直在为学校制定简单的程序,要求我:
(创建一个名为 UpdateProduct 的存储过程,该过程接收必需的产品 ID 参数以及可选的产品中的任何其他一个或多个字段 table。然后该过程将更新传入的任何字段,但保留任何其他字段原样。
- 如果这样执行:UpdateProduct @productID = 1, @name = ‘Steel Ball Bearing’;只有名称应该更改,所有其他字段仍应包含程序之前的值 被调用)
这就是我所拥有的,但我似乎仍然无法让它正常工作。我快疯了,因为几天来我一直在努力解决这个问题。任何指出我的错误的帮助都会很棒。
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
我认为你的 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;
前者不使用默认值,后者使用 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