'CASE WHEN' 更新时,其他列变为空

While 'CASE WHEN' update, other columns become null

我在 tmy 数据库中使用用户定义的 table 类型通过数据更新多个列table。

因此,我编写了以下存储过程并且运行良好。但是在更新相应的列时,这会使所有其他列为空。

我的存储过程:

ALTER PROCEDURE [dbo].[UpdateAbcdItemsByVendorPrice]
      @tblItemUpdate AbcdItemsUpdate READONLY
AS
BEGIN
    SET NOCOUNT ON;

    MERGE INTO AbcdItems abcdTable
    USING @tblItemUpdate tempTable
    ON abcdTable.ItemPartNumber = tempTable.ItemPartNumber
    WHEN MATCHED THEN
    UPDATE SET
        abcdTable.InpostPrice = CASE WHEN tempTable.VendorName = 'Inpost' THEN tempTable.Price END,
        abcdTable.InpostUpdatedDate = CASE WHEN tempTable.VendorName = 'Inpost' THEN GETUTCDATE() END,
        abcdTable.InpostAbsoluteItem = CASE WHEN tempTable.VendorName = 'Inpost' THEN 0 END,

        abcdTable.HRCPrice = CASE WHEN tempTable.VendorName = 'HRC' THEN tempTable.Price END,
        abcdTable.HRCUpdatedDate = CASE WHEN tempTable.VendorName = 'HRC' THEN GETUTCDATE() END,
        abcdTable.HRCAbsoluteItem = CASE WHEN tempTable.VendorName = 'HRC' THEN 0 END,

        abcdTable.AnnecyPrice = CASE WHEN tempTable.VendorName = 'Annecy' THEN tempTable.Price END,
        abcdTable.AnnecyUpdatedDate = CASE WHEN tempTable.VendorName = 'Annecy' THEN GETUTCDATE() END,
        abcdTable.AnnecyAbsoluteItem = CASE WHEN tempTable.VendorName = 'Annecy' THEN 0 END,

        abcdTable.SydneyPrice = CASE WHEN tempTable.VendorName = 'Sydney' THEN tempTable.Price END,
        abcdTable.SydneyUpdatedDate = CASE WHEN tempTable.VendorName = 'Sydney' THEN GETUTCDATE() END,
        abcdTable.SydneyAbsoluteItem = CASE WHEN tempTable.VendorName = 'Sydney' THEN 0 END;
END

My table 在为 'Inpost' 执行此查询之前:

InpostPrice    HRCPrice    ...
0              0           ...

我的 table 在为 'Inpost' 执行此查询后:

InpostPrice    HRCPrice    ...
213.57         NULL        ...

为什么HRCPrice 变成了null?抱歉英语不好。帮帮我!

您正在分配 NULL,因为您的 CASE 中没有 ELSE。我假设您想要使用旧值:

UPDATE SET
    abcdTable.InpostPrice = CASE WHEN tempTable.VendorName = 'Inpost'
                             THEN tempTable.Price 
                             ELSE abcdTable.InpostPrice END,
   .....

来自documentation

ELSE else_result_expression: Is the expression returned if no comparison operation evaluates to TRUE. If this argument is omitted and no comparison operation evaluates to TRUE, CASE returns NULL

您需要在 case 语句中添加 else 部分。

UPDATE SET
        abcdTable.InpostPrice = CASE WHEN tempTable.VendorName = 'Inpost' THEN tempTable.Price 
                                ELSE abcdTable.InpostPrice  END,
        abcdTable.InpostUpdatedDate = CASE WHEN tempTable.VendorName = 'Inpost' THEN GETUTCDATE() 
                                      ELSE abcdTable.InpostUpdatedDate END,
        abcdTable.InpostAbsoluteItem = CASE WHEN tempTable.VendorName = 'Inpost' THEN 0 
                                       ELSE abcdTable.InpostAbsoluteItem END,
......

因为每一列都无条件更新并且您的 case 语句将默认为 null。将当前值作为默认值:

     abcdTable.InpostPrice = CASE WHEN tempTable.VendorName = 'Inpost' THEN tempTable.Price 
else abcdTable.InpostPrice
END,