【问题标题】:SQL Server query dry runSQL Server 查询试运行
【发布时间】:2021-04-22 06:05:49
【问题描述】:

我在表上运行了很多执行INSERT、插入SELECTUPDATEALTER 的查询,并且在开发这些查询时,运行的中间步骤为了测试查询的各个部分是否正常工作,可能会更改表或表中的数据。

是否可以在不实际修改数据或表结构的情况下,对查询进行空运行并让 SQL Management Studio 为您提供结果?

目前我必须备份数据库并运行查询。如果它有效,那很好,如果无效,我必须恢复数据库(这可能需要大约一个小时),并且我试图避免浪费所有这些时间来恢复数据库。

【问题讨论】:

  • 我认为您可以根据需要使用临时表。例如,创建一个临时表,然后向其中插入数据。最后更新它并根据需要进行更改。完成所有工作后,您可以删除您将创建的表。为了更具体地说明我写的内容,请向我们提供您的插入等场景和您的表格。

标签: sql sql-server


【解决方案1】:

使用SQL transaction 进行更改,然后将其撤消。

在执行脚本之前:

BEGIN TRANSACTION;

执行脚本并完成检查后:

ROLLBACK TRANSACTION;

您的脚本中的每个更改都将被撤消。

注意:确保您的脚本中没有COMMIT

【讨论】:

  • 只是一个评论:如果有任何IDENTITY 列,那么回滚将导致值被“跳过”。这是意料之中的。
  • 几乎正是我想要的。谢谢
  • Make sure you don't have a COMMIT in your script!是什么意思
  • @PositiveGuy 这里的想法是运行脚本,检查结果是否正常,如果不是回滚。否则提交。如果您在脚本中有提交,则无论您如何看待结果,它都会完成。
  • 需要注意的是,查看事务中的更改需要WITH (NOLOCK) 表提示。
【解决方案2】:

开始事务,执行表操作,回滚如下所示:

BEGIN TRAN

UPDATE  C
SET column1 = 'XXX'
FROM table1 C

SELECT *
FROM table1
WHERE column1 = 'XXX'

ROLLBACK TRAN

这将回滚自该事务开始以来的最后一次提交以来执行的所有操作。

【讨论】:

  • 总是写一些描述你的答案如何有助于解决操作问题
  • 我在此添加了英文描述,如果您不同意,请随时回滚。在以后的所有问题和答案中,请用英文描述,代码转储没有用处。祝你好运。
  • TRAN 不是一个有效的语法
  • @PositiveGuy TRAN 确实似乎是有效的语法,至少对于 MS SQL (sql-server 在问题中被标记):docs.microsoft.com/en-us/sql/t-sql/language-elements/… 说语法开始 BEGIN { TRAN |交易}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2010-10-30
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多