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 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 travaillé que dans l'Analyseur de Requêtes. Je ne pouvais pas définir ce sur une ADO.NET connexion. Il est tout aussi bien parce que 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.
- Question intéressante en effet
- Je suis en supposant que c'est
executeOnly.CommandText = "SET NOEXEC ON; " + sqlCommand;
:3
Vous devez vous connecter pour publier un commentaire.
Je pense que la commande que vous cherchez 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 seraitSET PARSEONLY ON
, mais je suis franchement pas sûr de ce que la différence entre les deux est vraiment.+1 à Eric réponse. Mais j'ai trouvé
SET FMTONLY ON
également être utile commeSET NOEXEC ON
ne semble pas jeter toutes les erreurs.par exemple
En cours d'exécution 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 avecSET 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
SET NOEXEC ON
etSELECT * FROM ATableThatDoesNotExist
SET NOEXEC ON
et laSELECT
SET NOEXEC ON
et a obtenu leCommand(s) completed successfully.
message, puis l'exécution de la requête, qui produit alors de l'erreur. Si vous exécutez leSET NOEXEC ON;SELECT...
vous n'obtenez pas de message d'erreur. Par buter unGO
entre la SRET et la SÉLECTIONNER donnera l'erreurSQL Server 2012 peut analyser votre syntaxe, les procédures et les tables avec le système suivant des procédures et fonctions:
Qu'ils sont censés remplacer "FMTONLY SET".
J'ai testé et ils travaillent beaucoup mieux que "MIS à NOEXEC" et "SET PARSEONLY SUR"
Exemples:
Ne sera pas jeter une erreur:
Correctement jeter une erreur ("SET NOEXEC" et "SET PARSEONLY" ne jetez pas une erreur dans ce cas):
Utiliser la requête suivante
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.
Vraiment cela 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.
SET NOEXEC ON
est seulement la vérification de la requête en cours de validité. Une requête peut être valable, mais pas de retour des résultats corrects.VSTSDBPro a un analyseur de requête vous pouvez accéder par programmation: http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx