【问题标题】:How to see the result of the execution of the procedure without updating data tables?如何在不更新数据表的情况下查看程序的执行结果?
【发布时间】:2019-03-26 13:34:50
【问题描述】:

我有一个带有$UPDATE 的存储过程。我想在不更改表的情况下查看执行此过程的结果。

我正在考虑 PRINT 和 RAISERROR,但我不知道如何正确执行 - 是否需要修改我的程序,或者我可以专门执行我的程序。

我的一些程序代码:

...
UPDATE Table SET DateChange = @DateCh

程序执行

GO
DECLARE @UF int
EXECUTE @UF = [dbo].[sp_GoProc] 
GO

在输出中,我希望看到表中的更新值或更新的部分表。

【问题讨论】:

  • 我强烈建议您阅读这个问题并问问自己,您是否知道您发布的内容是什么。
  • @SeanLange 改变了问题
  • 不....像泥一样清澈。不知道你想要什么作为输出。您是否要返回在整个过程中在多个更新语句中更新的行?想一想,您是否看到仅使用一个简单的更新语句就更新了哪些行?不。每个更新语句都需要一个 before 和 after select 语句。
  • 您是否希望将其用于临时测试目的,还是将其作为永久功能?
  • 如果您不在生产系统中 -- BEGIN TRANSACTION; EXEC proc;SELECT 以供比较,ROLLBACK。如果您在生产系统上,这是不可取的,因为保持事务打开会严重影响其他会话!

标签: sql sql-server stored-procedures sql-server-2016


【解决方案1】:

由于这是出于测试目的,请在您的存储过程中尝试此操作

Begin tran
UPDATE Table SET DateChange = @DateCh
Select * from Table where DateChange = @DateCh
Rollback

你可以保持你的存储过程不被修改,并将执行包装在一个事务块中

Begin tran

DECLARE @RC int
EXECUTE @RC = [dbo].[sp_GoProc] 

Select * from Table

Rollback

当您执行存储过程时,您会看到 Table 的输出发生了变化,但在这两种情况下它们都会被回滚。

【讨论】:

    【解决方案2】:

    如果可以接受更改过程,您可以将任何 UPDATE 修改为 SELECT 以查看要更新的内容。例如,改变这个:

    UPDATE mt
    SET x=1
    FROM MyTable mt
    JOIN OtherTable ot ON mt.y=ot.y
    WHERE SomeCondition='true'
    

    到这里:

    SELECT * 
    FROM MyTable mt
    JOIN OtherTable ot ON mt.y=ot.y
    WHERE SomeCondition='true'
    

    话虽如此,您所要求的确实不是一个好习惯。测试执行更新的过程的最佳实践是制作数据库的测试副本,并在测试副本上运行该过程。然后你可以在测试副本中查看UPDATE的实际结果,你的真实数据不会受到影响。

    【讨论】:

    • 我有一个测试数据库,但之后我将在我的测试基础上进行,我需要以某种方式撤消更改,以使用其他变量对其进行测试。可以的,我会这样做的,谢谢
    • 要“重置”您的测试数据库以再次运行,只需用真实表覆盖测试表即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多