在SQL Server中如何查看IN子句影响的具体行?
SQL Server中UPDATE后显示具体受影响行的方法
问题场景
虚构数据表Person的结构及数据如下:
表名: Person PersonID(PK),PersonName,PersonAge 1,Jack,0 2,Joe,0 3,Jennifer,0 4,Jacky,0 5,John,0
执行以下UPDATE语句:
UPDATE Person SET PersonAge = 50 WHERE PersonName IN ('Jennifer', 'Peter')
默认仅返回:
1 row affected
实际只有Jennifer的年龄被修改为50,Peter因不存在未执行操作。需求是让SQL在返回受影响行数的同时,显示具体被修改的行信息,使用环境为SQL Server Management Studio 15.x版本。
解决方案
在SQL Server中,可通过OUTPUT子句实现该需求,它能直接返回UPDATE操作中被修改行的详细数据。
方法1:返回受影响行的关键信息
修改原UPDATE语句,添加OUTPUT子句指定需要返回的字段:
UPDATE Person SET PersonAge = 50 OUTPUT inserted.PersonID, inserted.PersonName, inserted.PersonAge WHERE PersonName IN ('Jennifer', 'Peter')
执行后,除了1 row affected的提示,还会输出一个结果集,展示被修改行的具体信息:
| PersonID | PersonName | PersonAge |
|---|---|---|
| 3 | Jennifer | 50 |
方法2:对比修改前后的数据
如果需要查看字段修改前后的变化,可以同时引用inserted(更新后的数据)和deleted(更新前的数据)两个内置逻辑表:
UPDATE Person SET PersonAge = 50 OUTPUT deleted.PersonID, deleted.PersonName, deleted.PersonAge AS 原年龄, inserted.PersonAge AS 新年龄 WHERE PersonName IN ('Jennifer', 'Peter')
执行后返回的结果集将包含修改前后的年龄对比:
| PersonID | PersonName | 原年龄 | 新年龄 |
|---|---|---|---|
| 3 | Jennifer | 0 | 50 |
注意事项
inserted存储UPDATE操作后的数据行,deleted存储UPDATE操作前的数据行,这两个是SQL Server专属的内置逻辑表- 该方案完全适配SQL Server Management Studio 15.x版本
内容的提问来源于stack exchange,提问作者Niek Jonkman
相关产品推荐
相关产品推荐

