Gre*_*orn 10 sql-server-2005 sql-server-2008 sql-server
我想我在某种程度上接近让它工作,但由于某种原因我仍然会出错。
我有以下更新查询:
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' THEN @Accessories
WHEN 'Description' THEN @Description
WHEN 'Specification' THEN @Specification
ELSE Details
END
WHERE DeviceID = 10
Run Code Online (Sandbox Code Playgroud)
参数由不同的用户填写。我现在面临的问题是,即使您想更新单个字段,您仍然必须使用旧数据填写其他参数。因此,我想设置选项 IF @parameter IS NULL THEN THEN 保留已存储在数据库中的值。我试图找到一些解决方案,类似以下查询的内容似乎是解决方案,但我无法让它工作:
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' IS NOT NULL THEN @Accessories
WHEN 'Description' IS NOT NULL THEN @Description
WHEN 'Specification' IS NOT NULL THEN @Specification
ELSE Details
END
WHERE DeviceID = 10
Run Code Online (Sandbox Code Playgroud)
数据库存储在 SQL Server 2008 中
在此先感谢您的帮助。
编辑以澄清:
原来的表是这样的
DeviceID|Name |Details |
10 |Accessories |earplugs |
10 |Description |protectors|
10 |Specification|BeatsByDre|
Run Code Online (Sandbox Code Playgroud)
出于出版原因,我进行了查询以扭转局面。因此,当运行 Select 查询时,返回表如下所示
DeviceID|Accessories|Description|Specification|
10 |earplugs |protectors |BeatsByDre |
Run Code Online (Sandbox Code Playgroud)
我创建了一个 UI 来让系统用户更新不同的字段,如附件、描述、规格。如果我使用顶部显示的查询更新所有字段,则更新有效。但是,当我将文本框留空时,我会收到一个错误,指出 @parameter 缺少值。因此,试图找到一种解决方案来仅更新写入内容的字段。因此,如果@parameter IS NULL 则保留数据库中的原始值。我找到了另一个解决方案,它非常接近我想要的但无法让它工作。这是另一个解决方案:https : //stackoverflow.com/questions/9387839/mysql-if-not-null-then-display-1-else-display-0
ype*_*eᵀᴹ 14
我认为这将解决问题:
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' THEN COALESCE(@Accessories, Details)
WHEN 'Description' THEN COALESCE(@Description, Details)
WHEN 'Specification' THEN COALESCE(@Specification, Details)
ELSE Details
END
WHERE DeviceID = 10 ;
Run Code Online (Sandbox Code Playgroud)
或者这个(为了避免冗余更新):
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' THEN @Accessories
WHEN 'Description' THEN @Description
WHEN 'Specification' THEN @Specification
ELSE Details
END
WHERE DeviceID = 10
AND ( Name = 'Accessories' AND @Accessories IS NOT NULL
OR Name = 'Description' AND @Description IS NOT NULL
OR Name = 'Specification' AND @Specification IS NOT NULL
) ;
Run Code Online (Sandbox Code Playgroud)
或者,使用表值构造函数:
UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
JOIN
( VALUES
('Accessories' , @Accessories),
('Description' , @Description),
('Specification' , @Specification)
) AS upd (Name, Details)
ON upd.Name = da.Name
WHERE da.DeviceID = 10
AND upd.Details IS NOT NULL ;
Run Code Online (Sandbox Code Playgroud)