J'adapte un grand nombre de scripts SQL Server 2005 pour fusionner deux de nos bases de données ensemble. Les scripts sont exécutés à partir d'un fichier .cmd qui appelle SQLCMD pour exécuter les scripts dans l'ordre. Cependant, je ressens une ou deux questions où les scripts échouent. P>
J'aimerais avoir un moyen rapide d'examiner l'état de certains des scripts où ils vont mal - vérifiez les valeurs variables, les résultats de certaines requêtes, des trucs comme ça. P>
Si j'avais ce problème avec un assemblage .NET, j'aurais augmenté le code avec Debug.assert ou définir des points d'arrêt dans lesquels je savais que les défaillances se produiraient, ce qui pause une exécution du programme et permettrait de vérifier les valeurs variables. . p>
Je me demandais, y a-t-il un équivalent dans SQL Server 2005? P>
3 Réponses :
J'utilise des fichiers par lots et vérifiez le code d'erreur comme celui-ci: -
SQLCMD.EXE -b -l 30 -E -S <SERVER> -i "<SQLFILE>.sql">>"%LOG_FILE%"2>&1
IF ERRORLEVEL 1 (
ECHO. Failed.
) ELSE (
ECHO. Succeeded.
)
Je n'ai jamais réussi à faire du débogage intégré bien travailler avec SQL Server - I Habituellement, j'ai également recours à "Printf" de débogage, en utilisant soit Imprimer ou RaisError déclarations. RAISError peut effectuer un formatage de l'argument de base, pour cracher les valeurs dans la fenêtre Messages. Par exemple. Si vous avez un paramètre @ VAL1, de type INT, vous pouvez faire: RAISERROR('Val1 = %i',10,1,@Val1) WITH NOWAIT
Cela fonctionnera:
-- 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
Pourquoi envelopper la chute d'un EXED?