Sql server 如何仅在一行受影响时执行更新?

Sql server 如何仅在一行受影响时执行更新?,sql-server,tsql,Sql Server,Tsql,我在SQL Server中有一个表,该表有一个PK ID和另一个逻辑主键,该主键由其他两列组成,尽管没有唯一的约束。比如说,table PERSON,PK=PERSON\u ID,然后是姓名、姓氏、年龄 我希望有可能说 UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY' 并且仅当“更新的行”=1时才执行它,否则超过1行根本不执行。问题是我不确定名字和姓氏是否唯一地识别了一个记录,我也没有办法先验地告诉它 想法?像这样

我在SQL Server中有一个表,该表有一个PK ID和另一个逻辑主键,该主键由其他两列组成,尽管没有唯一的约束。比如说,table PERSON,PK=PERSON\u ID,然后是姓名、姓氏、年龄

我希望有可能说

UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'
并且仅当“更新的行”=1时才执行它,否则超过1行根本不执行。问题是我不确定名字和姓氏是否唯一地识别了一个记录,我也没有办法先验地告诉它


想法?

像这样的想法应该可以

UPDATE Person p1
SET p1.AGE = 43
WHERE NAME = 'XX' AND SURNAME = 'YY'
AND NOT EXISTS (
  SELECT NULL FROM Person p2
  WHERE p1.NAME = p2.NAME
  AND p1.SURNAME = p2.SURNAME
  GROUP BY p2.NAME, p2.SURNAME
  HAVING COUNT(*) > 1)

请尝试下面的查询。。。它会帮助你的

UPDATE PERSON 
SET AGE = 43 
WHERE NAME = 'XX' 
  AND SURNAME = 'YYY' 
  AND 1 = (SELECT COUNT(*) FROM PERSON WHERE NAME = 'XX' AND SURNAME = 'YYY)

我会把条件放在更新之前,而不是放在where子句中

IF (SELECT COUNT(*) FROM PERSON WHERE NAME = 'XX' AND SURNAME = 'YYY') = 1
UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'

与编写复杂的WHERE子句或IF语句不同,我通常只是将整个内容包装在事务中并检查@@ROWCOUNT:

BEGIN TRAN
UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'
IF @@ROWCOUNT > 1 ROLLBACK TRAN ELSE COMMIT TRAN

and和@njk的可能副本-非副本;在这种情况下,用户只想在更新一行时执行,而不仅仅是更新第一条记录。@LittleBobbyTables抱歉。我选择这一行是因为它是最短的一行:。谢谢大家。
BEGIN TRAN
UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'
IF @@ROWCOUNT > 1 ROLLBACK TRAN ELSE COMMIT TRAN