2010-07-08 170 views
5

我正在調整大量的SQL Server 2005腳本以將兩個數據庫合併在一起。腳本從.cmd文件運行,該文件調用sqlcmd以按順序運行腳本。但是,我遇到了一個或兩個腳本失敗的問題。用於SQL Server的Debug.Assert的等價物

我想要一個快速的方法來看看他們出錯的一些腳本的狀態 - 檢查變量值,一些查詢的結果,類似的東西。

如果我遇到了.NET程序集的這個問題,我會用Debug.Assert來擴充代碼,或者在我知道發生故障的地方設置斷點,這樣會暫停程序執行並允許我檢出變量值。

我想知道,在SQL Server 2005中是否存在等價物?

回答

7

我從來沒有成功地使好與SQL Server集成的調試工作 - 我通常採取的「printf」調試,使用或者PRINTRAISERROR聲明。 RAISERROR可以執行一些基本的參數格式化,將值吐出到消息窗口中。例如。如果有一個參數@ VAL1,int類型的,可以這樣做:

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

(with nowait選項導致消息立即出現的,而不是緩衝消息/輸出的常規SQL行爲)

+0

不知道等待選項感謝包括 – JasonHorner 2010-07-09 04:54:24

0

我使用批處理文件,並檢查錯誤代碼是這樣的: -

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

IF ERRORLEVEL 1 (
    ECHO. Failed. 
) ELSE (
    ECHO. Succeeded. 
) 
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 
相關問題