2010-07-08 14 views
5

Estoy adaptando una gran cantidad de scripts de SQL Server 2005 para fusionar dos de nuestras bases de datos. Los scripts se ejecutan desde un archivo .cmd que llama a sqlcmd para ejecutar los scripts en orden. Sin embargo, estoy experimentando uno o dos problemas donde las secuencias de comandos están fallando.Equivalente de Debug.Assert para SQL Server

Me gustaría ver de manera rápida el estado de algunos de los scripts en los que fallan: compruebe los valores de las variables, los resultados de algunas consultas, cosas así.

Si tuviera este problema con un ensamblado .NET, aumentaría el código con Debug.Assertar o establecer puntos de interrupción donde sabía que iban a ocurrir fallas, lo que pausaría la ejecución del programa y me permitiría verificar la variable valores.

Me preguntaba, ¿existe un equivalente en SQL Server 2005?

Respuesta

7

nunca he conseguido hacer el trabajo de depuración integrada bien con SQL Server - Me suelen recurrir a "printf" depuración, usando bien PRINT o RAISERROR declaraciones. RAISERROR puede hacer un formato de argumento básico para escupir los valores a la ventana de mensajes. P.ej. si usted tiene un parámetro @ Val1, de tipo int, que puede hacer:

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

(la opción WITH NOWAIT hace que el mensaje aparezca inmediatamente, en lugar del comportamiento de SQL habitual de tampón mensajes/salidas)

+0

No sabía acerca de la opción de no esperar gracias por incluir – JasonHorner

0

utilizo archivos por lotes y comprobar el código de error como este: -

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

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

Esto funcionará:

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