Sql server 如何仅在一行受影响时执行更新?
我在SQL Server中有一个表,该表有一个PK ID和另一个逻辑主键,该主键由其他两列组成,尽管没有唯一的约束。比如说,table PERSON,PK=PERSON\u ID,然后是姓名、姓氏、年龄 我希望有可能说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行根本不执行。问题是我不确定名字和姓氏是否唯一地识别了一个记录,我也没有办法先验地告诉它 想法?像这样
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