2010-07-08 7 views
5

Ich passe eine große Anzahl von SQL Server 2005-Skripts an, um zwei unserer Datenbanken zusammenzuführen. Die Skripts werden von einer .cmd-Datei ausgeführt, die sqlcmd aufruft, um die Skripts der Reihe nach auszuführen. Ich habe jedoch ein oder zwei Probleme, bei denen die Skripts fehlschlagen.Equivalent von Debug.Assert für SQL Server

Ich möchte einen schnellen Weg, um den Zustand einiger der Skripte zu sehen, wo sie schief gehen - überprüfen Sie Variablenwerte, die Ergebnisse einiger Abfragen, solche Sachen.

Wenn ich dieses Problem mit einer .NET-Assembly hatte, würde ich den Code mit Debug.Assert erweitern oder Breakpoints setzen, wo ich wusste, dass Fehler auftreten würden, was die Programmausführung anhalten und mir erlauben würde, Variablen auszuprobieren Werte.

Ich frage mich, gibt es eine Entsprechung in SQL Server 2005?

Antwort

7

Ich habe es nie geschafft, das integrierte Debugging-Arbeit gut mit SQL Server zu machen - ich in der Regel auf „printf“ Debuggen greifen, mit entweder PRINT oder RAISERROR Aussagen. RAISERROR kann einige grundlegende Argumentformatierungen durchführen, um die Werte in das Nachrichtenfenster auszuspucken. Z.B. wenn Sie einen Parameter @ Val1, vom Typ int haben, können Sie tun:

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

(die WITH NOWAIT Option, die Nachricht verursacht sofort erscheinen, anstatt der üblichen SQL Verhalten von Puffern Nachrichten/Ausgänge)

+0

Wusste nicht über die Option keine Wartezeit danke für die Aufnahme – JasonHorner

0

I Batch-Dateien und überprüfen Sie den Fehlercode wie folgt aus: -

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

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

Das wird funktionieren:

-- 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