代码之家  ›  专栏  ›  技术社区  ›  Charles Roper

如何预览破坏性SQL查询?

  •  46
  • Charles Roper  · 技术社区  · 17 年前

    在SQL Server Management Studio中编写破坏性查询(例如,DELETE或UPDATE)时,我总是希望自己可以在不实际运行查询的情况下预览查询的结果。Access非常方便地允许您这样做,但我更喜欢手工编写SQL,遗憾的是,Access在这方面做得很差。

    所以我的问题是双重的:

    1. 是否有与Access类似的用于Contoso的附加组件,或配备良好SQL手工编码功能的单独工具,也可以预览破坏性查询的结果?

    2. 是否有“手工”预览的技术或最佳实践;例如,以某种方式使用交易?

    在我看来,做这类事情从根本上来说很重要,但我似乎无法通过谷歌找到任何东西(我可能只是在找错误的东西——我对这件事非常无知)。目前,我采取了一种相当麻烦的方法,在选择/删除/更新行中添加和删除注释,并确保进行备份。肯定有更好的办法吧?

    有人能帮忙吗?

    5 回复  |  直到 17 年前
        1
  •  61
  •   BJones MatBailie    10 年前

    我将使用SQL SERVER 2008及以后版本中的OUTPUT子句。..

    OUTPUT Clause (Transact-SQL)

    类似。..

    BEGIN TRANSACTION
    
    DELETE [table] OUTPUT deleted.* WHERE [woof] 
    
    ROLLBACK TRANSACTION
    

    插入和更新也可以使用“插入”表。MSDN文章涵盖了这一切。

    编辑:

    这就像事务中SELECT和DELETE的其他建议一样,除了它实际上同时执行这两个操作。因此,您打开一个事务,使用OUTPUT子句删除/插入/更新,并在输出所做操作的同时进行更改。然后,您可以选择回滚或提交。

        2
  •  25
  •   Kevin Buchan    17 年前

    我生活在害怕有人对我的数据库这样做的恐惧中,所以我总是要求我的团队做以下事情:

    BEGIN TRAN
     
    DELETE FROM X
    -- SELECT * FROM X
    FROM Table A as X JOIN Table B ON Blah blah blah
    WHERE blah blah blah
     
    ROLLBACK TRAN
    COMMIT TRAN
    

    这样,如果你不小心按了F5(完成了!),你就不会做任何更改。您可以在SQL语句末尾突出显示SELECT部分,以查看将更改哪些记录(以及更改多少)。然后,突出显示BEGIN TRAN和整个Delete语句并运行它。如果您删除了与预期数量相同的记录,请突出显示COMMIT TRAN并运行。如果有任何看起来不稳定的地方,突出显示ROLLBACK TRAN并执行它。

    我对任何UPDATE或DELETE语句都这样做。它救了我几次,但它总是让我安心。

        3
  •  7
  •   kravits88 JML    10 年前

    删除时:

    BEGIN TRANSACTION
    
       DELETE FROM table1 
       OUTPUT deleted.*
       WHERE property1 = 99 
    
    ROLLBACK TRANSACTION
    

    更新/插入时:

    BEGIN TRANSACTION
    
       UPDATE table1
       SET table1.property1 = 99
       OUTPUT inserted.*
    
    ROLLBACK TRANSACTION
    
        4
  •  2
  •   cmsjr    17 年前

    当您处于事务的上下文中时,您可以在事务提交之前的任何时候回滚更改。(通过显式调用commit-tran,或者如果出现将导致服务器隐式提交事务的条件)

    create table x (id int, val varchar(10))
    
    insert into x values (1,'xxx')
    begin tran
    
    delete from x
    select * from x
    
    rollback tran
    select * from x
    
        5
  •  1
  •   BankZ    17 年前

    当我想查看要删除的内容时,我只需将“delete”语句更改为“select*”。比起使用事务,我更喜欢这个,因为我不必担心锁定。