【问题标题】:SQl Management Studio - Find "Rows Affected" BEFORE running Update StatementSQl Management Studio - 在运行更新语句之前查找“受影响的行”
【发布时间】:2009-12-10 23:36:28
【问题描述】:

在 SQL Server Management Studio 中运行 Update 语句之前,我想看看它会影响多少行,所以我知道我的逻辑是正确的。有什么办法可以做到这一点?

我尝试过几次运行执行计划,运行后,当我将鼠标悬停在绿色更新图标上时,它会显示受影响的行,但有时它会显示 20.5 行的统计数据,这没有任何意义。

有什么想法吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    估计的执行计划会根据统计信息为您提供受影响的行,因此在这种情况下它不会真正帮助您。

    我建议复制您的 UPDATE 语句并将其转换为 SELECT。运行它以查看有多少行返回,并且您会得到更新多少行的答案。可以发一下 SQL 吗?

    【讨论】:

    • 只需将 Update 子句(From 之前的所有内容)替换为 'Select Count(*)'
    • 当然,在繁忙的生产系统上,在您发出SELECT COUNT(*) 查询和实际UPDATE 之间,这个数字很可能会发生变化,甚至可能会发生很大变化。不过,我认为你真的无能为力....
    【解决方案2】:

    几种方法:

    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

    【讨论】:

    • 使用 SELECT COUNT(*) 如果更新表中的一行由于连接而被同一条语句多次更新,则结果会不准确。通常不应该是一个问题,因为这通常会给出未定义的结果,这是一种不好的做法,但这是可能的。
    【解决方案3】:

    如果我有这样的陈述:

    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 之间出现拼写错误的风险。

    【讨论】:

      【解决方案4】:

      不是真的,只是使用与更新语句相同的条件执行 select count(*)。

      【讨论】:

        猜你喜欢
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多