[c#] Comment puis-je vérifier (analyser) par programme la validité d'une instruction TSQL?


Answers

+1 à la réponse d'Eric Mais j'ai trouvé SET FMTONLY ON pour être utile car SET NOEXEC ON ne semble pas vomir toutes les erreurs.

par exemple

SELECT * FROM ATableThatDoesNotExist

En cours d'exécution avec SET NOEXEC ON dit qu'il a réussi, malgré l' SET NOEXEC ON la table dans la base de données. L' SET FMTONLY ON avec SET FMTONLY ON place, lancera l'erreur "Nom d'objet invalide".

SET FMTONLY ON renvoie également des métadonnées sur le resultset qui sera retourné, ce qui peut être très pratique

Question

J'essaie de rendre mes tests d'intégration plus idempotents. Une idée était d'exécuter la restauration après chaque test, l'autre idée était d'analyser le texte par programmation, de la même manière que la case à cocher verte dans Query Analyzer ou SSMS.

Comment obtenir SQL Server pour analyser ma commande sans l'exécuter en utilisant ADO.NET?

MISE À JOUR: C'est ce qui a finalement fonctionné comme souhaité:

using (DbCommand executeOnly = Factory.DbCommand())
{
    executeOnly.Connection = command.Connection;
    executeOnly.CommandType = CommandType.Text;
    executeOnly.CommandText = "SET NOEXEC ON;" + sqlCommand;
    executeOnly.Connection.Open();
    executeOnly.ExecuteNonQuery();
}
//set more properties of command.
command.Execute();

Pour des raisons inexplicables, " SET PARSEONLY ON " n'a fonctionné que dans Query Analyzer. Je ne pouvais pas définir cela sur une connexion ADO.NET. C'est tout aussi bien parce que PARSEONLY semble capturer que des erreurs de syntaxe, ce qui n'est pas une erreur courante. SET NOEXEC ON une plus grande variété d'erreurs, comme une vue qui fait référence à une table ou une colonne manquante ou un paramètre manquant dans une procédure stockée.




Cela dépend vraiment de l'objectif des tests.

Le moyen le plus fiable serait d'utiliser le rollback après chaque test si vos déclarations s'y prêtent (ce n'est pas trop lourd pour le rendre viable).

Je l'ai fait par le passé et j'ai été heureux d'être informé des problèmes d'exécution que je n'aurais pas attrapé autrement.




Utilisez la requête suivante

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF





Related