【发布时间】:2009-07-02 19:37:19
【问题描述】:
我可以在存储过程中使用 PRINT 语句来调试我的代码。我在 SQL Server Management Studio 的“消息”选项卡中看到了输出。如何将一个或多个完整的 SELECT 语句输出转储到该消息选项卡?
我的存储过程返回多个输出变量,因此这里不能选择返回单个数据集。我正在努力寻找调试复杂程序的好方法。
【问题讨论】:
标签: sql-server-2005 tsql stored-procedures ssms
我可以在存储过程中使用 PRINT 语句来调试我的代码。我在 SQL Server Management Studio 的“消息”选项卡中看到了输出。如何将一个或多个完整的 SELECT 语句输出转储到该消息选项卡?
我的存储过程返回多个输出变量,因此这里不能选择返回单个数据集。我正在努力寻找调试复杂程序的好方法。
【问题讨论】:
标签: sql-server-2005 tsql stored-procedures ssms
设置“结果为文本”选项,您的结果和消息选项卡将合并为一个选项卡,结合您的 PRINT 和 SELECT 语句。
要将结果设置为文本,可以:
【讨论】:
将查询的全部内容打印到消息窗口可能会比它的价值更麻烦。相反,我建议从查询窗口调试该过程。您可以做的是在您的过程中添加一个可选参数,默认值为 NULL。您的应用程序不会通过它,因此您可以利用它来发挥自己的优势。例如:
Alter Procedure Foo(@Col1 int, @col2 varchar(20), @Debug Bit = NULL)
As
SET NOCOUNT ON
If @Debug = 1
Begin
Select * From SomeTable Where Col1 = @Col1
End
-- The rest of your code here
然后,当您从查询窗口调用此过程时,只需将值 1 传递给该 @Debug 参数的过程
【讨论】:
您可以从有问题的存储过程中填充一个临时表或表变量,然后在调用存储过程后从这些表中进行选择。确保删除并重新创建 sp 中的任何临时表。
CREATE TABLE ##t1 (x int)
GO
CREATE PROCEDURE Foo AS
BEGIN
TRUNCATE TABLE ##t1
INSERT INTO ##t1 SELECT column FROM table;
END
GO
exec Foo;
select x from ##t1;
【讨论】:
它必须在消息窗格中吗?我总是发现只运行选择查询很方便,它将结果输出到结果窗格中,实际输出在另一个结果集中。有时我会包含一个有助于识别结果的“标识符”列。例如:
select 'checkpoint1',a,b,c from table1
....
select 'table @a', * from @a
....
<actual query here>
当存储过程准备就绪时,只需删除这些脚手架语句
【讨论】: