2017-04-25 74 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 
相關問題