50 votes

Comment peut-I du programme, vérifier (parse) la validité d'une instruction TSQL?

Je suis en train de faire mes tests d'intégration plus idempotent. Une idée est d'exécuter la restauration après chaque test, l'autre idée était d'une certaine façon par programmation à l'analyse du texte, semblable à la case à cocher verte dans l'Analyseur de Requêtes ou de SSMS.

Comment puis-je obtenir SQL Server pour analyser ma commande sans l'exécuter à l'aide de ADO.NET?

Mise à JOUR: C'est ce que finalement travaillé comme il le souhaite:

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

Pour des raisons inexplicables, "SET PARSEONLY ON" seulement travaillé dans l'Analyseur de Requêtes. Je ne pouvais pas définir ce sur une ADO.NET connexion. Il est tout aussi bien parce qu' PARSEONLY semble à attraper les erreurs de syntaxe, ce qui n'est pas une erreur commune. SET NOEXEC ON va attraper un plus large variétés d'erreurs, par exemple une vue qui fait référence à un manque de table ou de colonne ou la disparition d'un paramètre dans une procédure stockée.

38voto

Eric Petroelje Points 40734

Je pense que la commande que vous recherchez est - SET NOEXEC ON. Si vous définissez pour votre connexion, les requêtes seront analysés, mais ne sera pas exécuté. Une autre option serait d' SET PARSEONLY ON, mais je suis franchement pas sûr de ce que la différence entre les deux est vraiment.

22voto

AdaTheDev Points 53358

+1 pour Eric réponse. Mais j'ai trouvé SET FMTONLY ON également être utile en tant que SET NOEXEC ON n'apparaît pas à jeter toutes les erreurs.

par exemple

SELECT * FROM ATableThatDoesNotExist

La course, qui avec SET NOEXEC ON dit qu'il a réussi, en dépit de la table n'existant pas dans la base de données. L'exécution avec SET FMTONLY ON au lieu de cela, va jeter le "nom d'objet non Valide" erreur.

FMTONLY SET SUR retourne également des métadonnées sur le jeu de résultats qui seraient retournés, ce qui peut s'avérer très utile

7voto

Ralf de Kleine Points 5476

Utiliser la requête suivante

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF

6voto

Pranay Rana Points 69934

SET PARSEONLY : Examine la syntaxe de chaque instruction Transact-SQL et retourne un message d'erreur, sans la compilation ou à l'exécution de l'instruction.

6voto

Martin Smith Points 174101

Vraiment, il dépend de la finalité des tests.

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

Je l'ai fait dans le passé et ont été heureux d'être informé de l'exécution des questions que je n'aurais pas pris de toute autre manière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X