2011-03-10 231 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

,您是否试图使用​​