'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,
.....
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,
我在 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,
.....
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,