Sql server Update语句更新表中的所有记录,而不是与条件相关的记录

Sql server Update语句更新表中的所有记录,而不是与条件相关的记录,sql-server,tsql,Sql Server,Tsql,我有一个名为STG_Params的下表: Schema Table DataBase Flag_Full dbo Users LocalDB 1 dbo bankInformation LocalDB 0 dbo Language LocalDB 0 dbo Employee LocalDB 1 dbo WorkPermit LocalDB 1 dbo Roles

我有一个名为STG_Params的下表:

Schema Table           DataBase Flag_Full
dbo    Users           LocalDB  1
dbo    bankInformation LocalDB  0
dbo    Language        LocalDB  0
dbo    Employee        LocalDB  1
dbo    WorkPermit      LocalDB  1
dbo    Roles           LocalDB  1
dbo    School          LocalDB  1
dbo    Nationality     LocalDB  1
dbo    Degree          LocalDB  1
我想更新具有如下表名的记录,并将其标志_Full设置为0:

UPDATE STG_Param SET Flag_Full = 0 
WHERE EXISTS (SELECT m.* from STG_Param m where m.[Table] in ('Users','Employee','Roles',WorkPermit')

当我执行查询时,它会用标志_Full=1更新所有记录,包括where条件中未提及的表名。

您可以为正在更新的表提供别名,并直接使用where条件。如果需要根据另一个表中的条件获取表列表,还可以在WHERE子句之前使用联接

UPDATE STG 
SET STG.Flag_Full = 0 
FROM STG_Param STG
WHERE STG.[Table] IN ('Users','Employee','Roles','WorkPermit')

这里有两个问题构成了您的完整陈述。第一个是
UPDATE STG\u Param SET Flag\u Full=0
,这将更新一行,前提是以下子查询(不相关)至少返回一行:
SELECT m.*from STG\u Param m,其中m.[表]位于('Users'、'Employee'、'Roles',WorkPermit')

这意味着,如果表
STG_-Param
中至少有一行的值为
'Users'
'Employee'
'Roles'
'WorkPermit'
,则表
STG_-Param
中的所有行都将更新,当
存在时
将返回TRUE

这里您需要的只是一个简单的
,其中

UPDATE STG_Param 
SET Flag_Full = 0 
WHERE [Table] IN ('Users','Employee','Roles',WorkPermit');

您的
WHERE
子句总是计算为
true
,因为您只是检查四个表名中是否至少有一个存在。情况总是如此,因此每一行都是要更新的数据的一部分。