拥有一个包含1000多行的表(设置)和两列(名称,值)。我需要根据名称更新一些值。
使用Updating one column based on the value of another column我得到"无效的列名称' AppName'和AppID'"。
update Test.dbo.Setting
set Value = (CASE
WHEN Name = AppName
THEN 'Test1'
WHEN Name = AppID
THEN 'Test2'
END);
为什么这会在另一个线程中起作用,但在我的示例中却不行?无论如何,我继续用单引号包装AppName和AppID。
update Test.dbo.Setting
set Value = (CASE
WHEN Name = 'AppName'
THEN 'Test1'
WHEN Name = 'AppID'
THEN 'Test2'
END);
返回"无法将值NULL插入列'值',表' Test.dbo.Config&#39 ;;列不允许空值。更新失败。"这是真的,它不允许NULL,我的想法是因为没有ELSE语句它试图将NULL写入其余的1k +值。
所以让我们试试吧..
update Test.dbo.Setting
set Value = (CASE
WHEN Name = 'AppName'
THEN 'Test1'
WHEN Name = 'AppID'
THEN 'Test2'
ELSE Value
END);
哎呀,它有效,但也会将所有值覆盖到它们当前的状态。所以尽管它可以正常运行"除了我指定的值之外,我不想触及其他值。
除了下一步要尝试的一塌糊涂之外......关于如何优化的更好的想法?
感谢。
答案 0 :(得分:1)
只需添加WHERE子句即可仅更新要更新的行:
UPDATE Test.dbo.Setting
SET [Value] = (CASE WHEN [Name] = 'AppName'
THEN 'Test1'
WHEN [Name] = 'AppID'
THEN 'Test2'
END)
WHERE [Name] IN ('AppName', 'AppID')
答案 1 :(得分:0)
您始终可以尝试按以仅更新所需的行而不覆盖值:
update Test.dbo.Setting
set Value = (CASE
WHEN Name = 'AppName'
THEN 'Test1'
WHEN Name = 'AppID'
THEN 'Test2'
END)
WHERE Name IN ('AppName','AppID')