【发布时间】:2009-12-10 23:36:28
【问题描述】:
在 SQL Server Management Studio 中运行 Update 语句之前,我想看看它会影响多少行,所以我知道我的逻辑是正确的。有什么办法可以做到这一点?
我尝试过几次运行执行计划,运行后,当我将鼠标悬停在绿色更新图标上时,它会显示受影响的行,但有时它会显示 20.5 行的统计数据,这没有任何意义。
有什么想法吗?
【问题讨论】:
标签: sql sql-server
在 SQL Server Management Studio 中运行 Update 语句之前,我想看看它会影响多少行,所以我知道我的逻辑是正确的。有什么办法可以做到这一点?
我尝试过几次运行执行计划,运行后,当我将鼠标悬停在绿色更新图标上时,它会显示受影响的行,但有时它会显示 20.5 行的统计数据,这没有任何意义。
有什么想法吗?
【问题讨论】:
标签: sql sql-server
估计的执行计划会根据统计信息为您提供受影响的行,因此在这种情况下它不会真正帮助您。
我建议复制您的 UPDATE 语句并将其转换为 SELECT。运行它以查看有多少行返回,并且您会得到更新多少行的答案。可以发一下 SQL 吗?
【讨论】:
SELECT COUNT(*) 查询和实际UPDATE 之间,这个数字很可能会发生变化,甚至可能会发生很大变化。不过,我认为你真的无能为力....
几种方法:
1) 将 UPDATE 调整为 SELECT COUNT(*): 例如
UPDATE t
SET t.Value = 'Something'
FROM MyTable t
WHERE t.OtherValue = 'Something Else'
变成:
SELECT COUNT(*)
FROM MyTable t
WHERE t.OtherValue = 'Something Else'
只需快速调整即可将 UPDATE...SET... 部分注释为 SELECT COUNT(*)
或者....
2) 在 BEGIN TRANSACTION....ROLLBACK TRANSACTION 块中运行 UPDATE
【讨论】:
如果我有这样的陈述:
UPDATE
MT
FROM
My_Table MT
INNER JOIN Some_Other_Table SOT ON
....
WHERE
....
然后要获得计数,我只需将开头替换为以下内容:
SELECT
COUNT(DISTINCT MT.<primary key column>)
FROM
My_Table MT
INNER JOIN Some_Other_Table SOT ON
....
WHERE
....
另一种选择是简单地将其包装在事务中并立即发出 ROLLBACK。这样做可能需要更长的时间,并且您最终会在表上锁定,但您不会冒在 UPDATE 和 SELECT 之间出现拼写错误的风险。
【讨论】:
不是真的,只是使用与更新语句相同的条件执行 select count(*)。
【讨论】: