TSQL:防止对现有数据进行空值更新

TSQL:防止对现有数据进行空值更新,sql,tsql,Sql,Tsql,我有两张桌子: Orders表I更新并希望保留现有数据,并防止用空值覆盖 WRK_表此表与订单相同,但不能保证运行更新时所有列都有数据 PK列“主订单编号” 表中有许多列,WRK_表将有PK,但其他列中的数据不能计算在内 我希望WRK_表只使用实际数据而不是空值更新订单。 我是这样想的: UPDATE [Orders] SET [Status] = CASE WHEN S.[Status] IS NOT NULL THEN S.[Status] END FROM [WRK_TABLE] S

我有两张桌子:

Orders表I更新并希望保留现有数据,并防止用空值覆盖

WRK_表此表与订单相同,但不能保证运行更新时所有列都有数据

PK列“主订单编号” 表中有许多列,WRK_表将有PK,但其他列中的数据不能计算在内

我希望WRK_表只使用实际数据而不是空值更新订单。 我是这样想的:

UPDATE [Orders] 
SET [Status] = CASE WHEN S.[Status] IS NOT NULL THEN S.[Status] END 
FROM [WRK_TABLE] S
WHERE [Orders].[Master_Ordernum] = S.[Master_Ordernum]
Orders中的现有数据正在用空值更新,这有帮助吗

update orders set name = work.name 
from orders 
inner join work on orders.id = work.id and work.Name is not null
不是相同的列/表名称,但您应该了解

编辑

您的SQL,未经测试

UPDATE Orders
SET [Status] = WRK_Table.[Status]
FROM [Orders] 
inner join WRK_Table  on [Orders].[Master_Ordernum] = [WRK_Table].[Master_Ordernum] and WRK_Table.[Status] is not null
如果您想测试和撤消数据,只需执行类似于假设没有100行的操作

begin tran
/*。。更新的SQL*/

select * from orders // review the data

rollback tran // Undo changes

如果要使用Case语句,则需要包含一个else,以防止它仅仅插入null。试试这个-如果工作表有空值,就让它用现有值覆盖该值

UPDATE [Orders] 
SET [Status] = CASE WHEN S.[Status] IS NOT NULL THEN S.[Status] else [Orders].[Status] END 
FROM [WRK_TABLE] S
WHERE [Orders].[Master_Ordernum] = S.[Master_Ordernum]

不确定你是否可以使用

Update my_table set col = ISNULL(@newval,@existingval) where id=@id

在您的查询中,它将插入带有数据的行,没有问题,但是空行的情况是,它将遍历您的case语句,不满足任何要求,然后由于没有其他要求,返回NULL。正是你不想要的。你会想过滤你的专栏,就像史蒂夫·德雷克在他的回答中所做的那样。我现在正在按照温迪的建议更新我的陈述。小测试看起来不错。我希望在某些情况下,扩展到100+列的影响不会太坏,因为它是SSIS包的一部分。如果需要的话,我希望不必链接表。关于COALESCE和ISNULL的好信息可以在MSDN博客上找到。