如何使用print语句调试存储过程?

时间:2013-03-14 15:02:46

标签: sql-server tsql stored-procedures

我正在尝试在SQL Server Management Studio 2008中调试存储过程。我想插入一些print语句来测试一些我知道错误的IF语句。

为了进行调试,我尝试使用PRINT '5'命令。

我尝试使用像RAISERROR这样的'RAISERROR (N'Start',10,1) WITH NOWAIT'

但这些没有显示任何打印输出,只显示结果集。该消息只是说1 row affected

我试图像这样编写代码(也许这是一种不正确的方法):

SET NOCOUNT ON         
RAISERROR (N'Start',10,1) WITH NOWAIT    
DECLARE @DocHandle INT        
DECLARE @PageSize INT, @PageIndex INT, @TOTL_CONT NUMERIC(5,0), @Paging BIT        
DECLARE @Type INT, @Search varchar(20) , @ORDE nVARCHAR(50), @SORT_ID nVARCHAR(50) 
DECLARE @CreatedOn varchar(25), @SystemGenerate bit   

使用print语句调试存储过程的最佳方法是什么?

5 个答案:

答案 0 :(得分:26)

如果您正在使用MSSQL Server,则管理工作室的打印语句将在“结果”选项卡下的“消息”选项卡下打印出来。

enter image description here

将在那里出现打印报告。

答案 1 :(得分:13)

以下是使用print语句的示例。它们应显示在消息选项卡下,如前一个人所示。

    Declare @TestVar int = 5;

    print 'this is a test message';
    print @TestVar;
    print 'test-' + Convert(varchar(50), @TestVar);

Print Messages

答案 2 :(得分:12)

在我得到重复答案之前;我承认我在这里接受的唯一答案是one上面的KM.。我拒绝投票给其他答案,因为他们都没有回答问题或他们不够。 PRINT输出确实显示在消息窗口中,但这根本不是所要求的。

为什么在我的存储过程执行期间不显示PRINT语句输出?
这个答案的简短版本是你将你的sproc执行发送到SQL服务器,并且在完成整个事务之前它不会响应。这是external link的更好答案。

  • 如果有更多意见/观察,请将注意力集中在这篇SO here上。
  • 请特别关注Phil_factor发布的同一篇文章的answer(哈哈!喜欢SQL幽默)
  • 关于使用RAISERROR WITH NOWAIT的建议,请answer
  • 查看同一帖子的JimCarden

不要做这些事

  1. 有些人的印象是他们可以在PRINT语句后使用GO语句,但是你不能使用sproc的GO语句INSIDE。所以解决方案就出来了。
  2. 我不建议选择你的打印语句,因为它只是会弄乱你的结果集,如果你的程序员以后应该被程序使用,那么你必须知道哪些结果集是循环浏览数据读取器的结果时跳过。这只是一个坏主意,所以不要这样做。
  3. SELECT-ING打印报表的另一个问题是它们并不总是立即显示。我对不同的执行方式有不同的经验,所以不要指望与这种方法有任何一致性。
  4. 替代存储过程中的PRINT
    实际上这在我看来是一种狡猾的工作,因为语法在使用它的上下文中令人困惑,但谁知道它可能会在未来被Microsoft更新。我只是不喜欢提出错误的想法,唯一的目的是打印调试信息...

    看起来围绕这个问题的唯一方法就是使用,正如已经多次解释过RAISERROR WITH NOWAIT。我提供了一个示例,并指出了这种方法的一个小问题:

    ALTER
    --CREATE 
        PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample]
    AS
    BEGIN
        SET NOCOUNT ON;
    
        -- This will print immediately
        RAISERROR ('RE Start', 0, 1) WITH NOWAIT
        SELECT 1;
    
        -- Five second delay to simulate lengthy execution
        WAITFOR DELAY '00:00:05'
    
        -- This will print after the five second delay
        RAISERROR ('RE End', 0, 1) WITH NOWAIT
        SELECT 2;
    END
    
    GO
    
    EXEC [dbo].[PrintVsRaiseErrorSprocExample]
    

    两个SELECT语句结果仅在执行完成后显示, print 语句将按上面显示的顺序显示。

    此方法的潜在问题
    假设你有一个接一个的PRINT语句和RAISERROR语句,然后它们都打印出来。我确信这与缓冲有关,但请注意,这可能会发生。

    ALTER
    --CREATE 
        PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample2]
    AS
    BEGIN
        SET NOCOUNT ON;
    
        -- Both the PRINT and RAISERROR statements will show
        PRINT 'P Start';
        RAISERROR ('RE Start', 0, 1) WITH NOWAIT
        SELECT 1;
    
        WAITFOR DELAY '00:00:05'
    
        -- Both the PRINT and RAISERROR statements will show
        PRINT 'P End'
        RAISERROR ('RE End', 0, 1) WITH NOWAIT
        SELECT 2;
    END
    
    GO
    
    EXEC [dbo].[PrintVsRaiseErrorSprocExample2]
    

    因此,这里的工作是,不要同时使用PRINT和RAISERROR,只选择一个而不是另一个。如果您希望在执行sproc期间显示输出,请使用RAISERROR WITH NOWAIT。

答案 3 :(得分:11)

尝试使用:

RAISERROR('your message here!!!',0,1) WITH NOWAIT

您也可以尝试切换到“结果到文本”,它只是默认工具栏上“执行”右侧的几个图标。

在上述两种情况下,您仍然看不到消息,请确保您正在运行与您正在编辑的过程相同的服务器/数据库/所有者版本。确保您正在执行RAISERROR命令,将其作为程序中的第一个命令。

如果其他所有方法都失败了,您可以创建一个表格:

create table temp_log (RowID int identity(1,1) primary key not null
                      , MessageValue varchar(255))

然后:

INSERT INTO temp_log VALUES ('Your message here')

然后在运行程序(不提供回滚)后,只需select表。

答案 4 :(得分:-1)

在MSDN文档中查看此Howto:Run the Transact-SQL Debugger - 使用PRINT语句,但也许它可以帮助您调试代码。

此YouTube视频:SQL Server 2008 T-SQL Debugger显示调试器的使用。

=>存储过程用Transact-SQL编写。这允许您调试所有Transact-SQL代码,因此它就像在Visual Studio中调试一样,定义断点并观察变量。