SQL Server 2005存储过程
我正在编写一个存储过程来更新事务表。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“。
我不明白为什么:(
谢谢!
您收到错误也可能是因为您在每个set
年底失踪','
原因。
update tblX
set
disposalID = COALESCE(@disposalID, disposalID),
receiptID = COALESCE(@recID, receiptID),
shipmentID = COALESCE(@shipID,shipmentID)
where ID = @sID
作为替代方案,您可以使用ISNULL(),假定您使用的是SQL服务器。
我把它改成了ISNULL,但我一直得到: 'receiptID'附近的语法不正确 – 2011-03-10 16:24:31
@xrum - 这是因为你缺少'',''。请参阅我的回答 – 2011-03-10 16:25:32
谢谢!如果我使用COALESCE或ISNULL,那么它有什么区别呢?我在网上查了一下,他们看起来一样.. – 2011-03-10 16:26:27
您可以执行的操作是将每个更新语句放入IF
或CASE
语句中。像:
IF @disposalid is not null:
update tblX
set disposalID = @disposalID
,您是否试图使用
**什么数据库系统,什么版本?**存储的特效不是厂商之间移植,并没有足够的SQL标准小组委员会,以规范有意义的“一般”答案,适用于每个数据库系统..... – 2011-03-10 16:20:41
我使用SQL 2005 – 2011-03-10 16:23:51
不,您正在使用** 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