2017-04-25 78 views
0

我目前正在制作存储过程以更新产品详细信息。我想让它(如果可能的话)只在执行时在'values'列下输入的字段被更新,其余部分保持不变。更新存储过程 - 仅更新某些字段并保留其他字段

ALTER PROCEDURE [dbo].[spUpdateProduct] 
@ProductID int, @Brand nvarchar(30), @ModelNo nvarchar(9), @Description 
nvarchar(50), @CostPrice decimal(6,2), @Stock int, @SalePrice decimal(6,2) 

AS 
BEGIN 
SET NOCOUNT ON 

UPDATE tblProduct 
SET     
    Brand = @Brand, 
    ModelNo = @ModelNo, 
    [Description] = @Description, 
    CostPrice = @CostPrice, 
    Stock = @Stock, 
    SalePrice = @SalePrice 

WHERE ProductID = @ProductID 

END 

这是目前我所拥有的。当我去改变一个值时,它错误地说我没有输入'Brand'的值,这是'ProductID'之后的下一个值。

Execute Window

Error when trying to update two fields (ProductID and CostPrice)

编辑:字段设置为 'NOT NULL' 当我创建的表。

+0

首先,当使用SSMS的执行窗口时,如果您没有将值传递给参数,则需要检查传递空值复选框。其次,列是可以空的吗? –

+0

我试过了,但它错误说我不能插入NULL值,因为列不允许为空(因为我在创建表时创建了'NOT NULL'列)。 – killerwild

回答

3

这就是我该怎么做的。有无效的参数

ALTER PROCEDURE [dbo].[spUpdateProduct] 
@ProductID int, 
@Brand nvarchar(30) = null, 
@ModelNo nvarchar(9) = null, ..... (to all the parameters except @ProductID) 

AS 
BEGIN 
SET NOCOUNT ON 

UPDATE tblProduct 
SET     
    Brand = isNull(@Brand, Brand), 
    ModelNo = isNull(@ModelNo, ModelNo), 
    [Description] = isNull(@Description, Description),... 


WHERE ProductID = @ProductID 

END 

基本上你只是更新字段,如果参数不为空,否则保持旧值。

+0

如果我在创建表时将我的字段设置为'not null',那么似乎我无法使用此方法。有没有解决方法或其他方式,或者我需要重新创建没有为字段设置'not null'的表? – killerwild

+0

你不插入NULL,你只是用它来检查你是否有参数。确保IsNull()函数写入正确... isNull(@parameter,columnName)... –

+0

这是我在我的评论+1中瞄准的方向。但是,对于可为空的列,这不是最好的解决方案,因为它将无法将列设置为空。 –

1

你有两个问题 - (a)必须提供存储过程的参数(错误告诉你这一点)和(b)当没有提供参数时该怎么做。对于第一个问题,检查通空值或使用SQL查询来执行像这样的存储过程:

exec spUpdateProduct 1, null, null, null, 140.99, null, null

对于问题(b)中,使用聚结更新基于值被传递:

ALTER PROCEDURE [dbo].[spUpdateProduct] 
@ProductID int, @Brand nvarchar(30), @ModelNo nvarchar(9), @Description 
nvarchar(50), @CostPrice decimal(6,2), @Stock int, @SalePrice decimal(6,2) 

AS 
BEGIN 
SET NOCOUNT ON 

UPDATE t 
SET     
    Brand = coalesce(@Brand, t.Brand), 
    ModelNo = coalesce(@ModelNo, t.ModelNo), 
    [Description] = coalesce(@Description, t.Description), 
    CostPrice = coalesce(@CostPrice, t.CostPrice), 
    Stock = coalesce(@Stock, t.Stock), 
    SalePrice = coalesce(@SalePrice, t.SalePrice) 
FROM tblProduct as t 
WHERE ProductID = @ProductID 

END 
相关问题