我正在尝试在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语句调试存储过程的最佳方法是什么?
答案 0 :(得分:26)
如果您正在使用MSSQL Server,则管理工作室的打印语句将在“结果”选项卡下的“消息”选项卡下打印出来。
将在那里出现打印报告。
答案 1 :(得分:13)
以下是使用print语句的示例。它们应显示在消息选项卡下,如前一个人所示。
Declare @TestVar int = 5;
print 'this is a test message';
print @TestVar;
print 'test-' + Convert(varchar(50), @TestVar);
答案 2 :(得分:12)
在我得到重复答案之前;我承认我在这里接受的唯一答案是one上面的KM.。我拒绝投票给其他答案,因为他们都没有回答问题或他们不够。 PRINT输出确实显示在消息窗口中,但这根本不是所要求的。
为什么在我的存储过程执行期间不显示PRINT语句输出?
这个答案的简短版本是你将你的sproc执行发送到SQL服务器,并且在完成整个事务之前它不会响应。这是external link的更好答案。
不要做这些事
替代存储过程中的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中调试一样,定义断点并观察变量。