我正在调整大量SQL Server 2005脚本以将两个数据库合并在一起。脚本从.cmd文件运行,该文件调用sqlcmd以按顺序运行脚本。但是,我遇到了脚本失败的一两个问题。
我想快速查看一些出错的脚本的状态 - 检查变量值,某些查询的结果,以及类似的东西。
如果我在.NET程序集中遇到此问题,我会使用Debug.Assert扩充代码或设置断点,我知道会发生故障,这会暂停程序执行并允许我检查变量值
我想知道,SQL Server 2005中是否存在等效内容?
答案 0 :(得分:7)
我从未设法使用SQL Server很好地完成集成调试 - 我通常使用PRINT或RAISERROR语句进行“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.
)