SQL Server的Debug.Assert的等价物

时间:2010-07-08 06:58:07

标签: sql-server sql-server-2005 debugging

我正在调整大量SQL Server 2005脚本以将两个数据库合并在一起。脚本从.cmd文件运行,该文件调用sqlcmd以按顺序运行脚本。但是,我遇到了脚本失败的一两个问题。

我想快速查看一些出错的脚本的状态 - 检查变量值,某些查询的结果,以及类似的东西。

如果我在.NET程序集中遇到此问题,我会使用Debug.Assert扩充代码或设置断点,我知道会发生故障,这会暂停程序执行并允许我检查变量值

我想知道,SQL Server 2005中是否存在等效内容?

3 个答案:

答案 0 :(得分:7)

我从未设法使用SQL Server很好地完成集成调试 - 我通常使用PRINTRAISERROR语句进行“printf”调试。 RAISERROR可以执行一些基本的参数格式化,将值吐出到消息窗口。例如。如果你有一个类型为int的@ Val1参数,你可以这样做:

RAISERROR('Val1 = %i',10,1,@Val1) WITH NOWAIT

(WITH NOWAIT选项导致消息立即显示,而不是缓冲消息/输出的通常SQL行为)

答案 1 :(得分:1)

这将有效:

-- Assert procedure equivalent to other languages.
-- raiserror() will cause sql execution to stop and throw execep in C# code that is running this statement.
-- Usage:
-- declare @shouldBeTrue bit
-- set @shouldBeTrue = case when 1=0 then 1 else 0 end
-- exec _AT3Assert @shouldBeTrue, 'failed'
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = '_AT3Assert' AND ROUTINE_SCHEMA = 'dbo' AND ROUTINE_TYPE = 'PROCEDURE')
 EXEC ('DROP PROCEDURE dbo._AT3Assert')
 GO
create procedure dbo._AT3Assert
    @shouldBeTrue bit,      
    @errorMsg nvarchar (max)
AS
    SET NOCOUNT ON;
    if @shouldBeTrue is null or @shouldBeTrue <> 1
    begin
        raiserror (@errorMsg, -- Message text.
               11, -- Severity.
               1 -- State.
               );
    end
GO

答案 2 :(得分:0)

我使用批处理文件并检查错误代码如下: -

SQLCMD.EXE -b -l 30 -E -S <SERVER> -i "<SQLFILE>.sql">>"%LOG_FILE%"2>&1

IF ERRORLEVEL 1 (
    ECHO. Failed.
) ELSE (
    ECHO. Succeeded.
)