TSQL:防止对现有数据进行空值更新
我有两张桌子: Orders表I更新并希望保留现有数据,并防止用空值覆盖 WRK_表此表与订单相同,但不能保证运行更新时所有列都有数据 PK列“主订单编号” 表中有许多列,WRK_表将有PK,但其他列中的数据不能计算在内 我希望WRK_表只使用实际数据而不是空值更新订单。 我是这样想的: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
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博客上找到。