2011-03-10 220 views
0

我正在編寫一個存儲過程來更新事務表。SQL Server 2005存儲過程

我會在一個時間(發貨,收貨或處置)

來更新一個交易類型如果我更新發貨,我將傳遞一個值,並保留其他兩個空白。

如何編寫一個存儲過程,以便當我傳入的值不是NULL(或0,無論哪個更容易)時只更新該字段,並保留其他人原樣?

這裏是我現在所在:

CREATE PROCEDURE [dbo].[sp_UpdateTransaction] 
    -- Add the parameters for the stored procedure here 
    @ID int, 
    @disposalID int, 
    @shipID int, 
    @recID int, 
as 
begin 
    update tblX 
    set 
    disposalID = COALESCE(@disposalID, disposalID) 
    receiptID = COALESCE(@recID, receiptID) 
    shipmentID = COALESCE(@shipID,shipmentID) 
    where ID = @sID 
END 

COALESCE似乎並沒有工作,因爲我不斷收到錯誤,有另一種功能,我可以用它來做到這一點?

我越來越:

附近有語法錯誤receiptID「。

我不明白爲什麼:(

謝謝!

+1

**什麼數據庫系統,什麼版本?**存儲的特效不是廠商之間移植,並沒有足夠的SQL標準小組委員會,以規範有意義的「一般」答案,適用於每個數據庫系統..... – 2011-03-10 16:20:41

+0

我使用SQL 2005 – 2011-03-10 16:23:51

+1

不,您正在使用** Microsoft ** SQL ** Server ** 2005. [SQL](http:/ /en.wikipedia.org/wiki/SQL)是一種標準語言,由MS SQL Server,Oracle DBMS,IBM DB2,MySQL,PostgreSQL,Interbase實現......因此,您應該僅將此標籤用於通用,獨立於供應商的問題。 – rsenna 2011-03-10 16:30:18

回答

8

您收到錯誤也可能是因爲您在每個set年底失蹤','原因。

update tblX 
set 
disposalID = COALESCE(@disposalID, disposalID), 
receiptID = COALESCE(@recID, receiptID), 
shipmentID = COALESCE(@shipID,shipmentID) 
where ID = @sID 

作爲替代方案,您可以使用ISNULL(),假定您使用的是SQL服務器。

+1

我把它改成了ISNULL,但我一直得到: 'receiptID'附近的語法不正確 – 2011-03-10 16:24:31

+0

@xrum - 這是因爲你缺少'',''。請參閱我的回答 – 2011-03-10 16:25:32

+1

謝謝!如果我使用COALESCE或ISNULL,那麼它有什麼區別呢?我在網上查了一下,他們看起來一樣.. – 2011-03-10 16:26:27

2

您可以執行的操作是將每個更新語句放入IFCASE語句中。像:

IF @disposalid is not null: 
    update tblX 
    set disposalID = @disposalID 
1

,您是否試圖使用​​