Nous avons de longs scripts de migrations et ces derniers produisent de nombreux messages (jusqu'a 15 millions de lignes).
Pour des raisons de validation, cette information doit être tenue en rétention pendant une période plus ou moins longue.
Dans cette quantité incroyable d'information (dont certains "x rows affected" ne peuvent être évités), il convient également de pouvoir faire des recherches sur des mots clés (comme par exemple "error").
C'est que la manipulation de logs/résultats aussi longs n'est pas franchement dans les cordes du Management Studio de Sql Server.
Certains logiciels en ligne de commande s'en sortent vraiment mieux.
Le besoin
Il faut donc avoir la possibilité d'exécuter des scripts sql et récupérer les messages (et si possible les résultats) dans un fichier texte.
Ce fichier pourra par la suite être utilisé pour effectuer les vérifications nécessaires.
La solution: SqlCmd
SqlCmd est un utilitaire Sql Serveur en ligne de commande.
Apparu avec Sql Server 2005, ce dernier permet d'exécuter des scripts (en intéractif ou non) depuis une console DOS. Très pratique pour automatiser certaines tâche (ou accéder à la connexion administrative), SqlCmd permet également d'exécuter des fichier Sql et récupérer les résultat et ce y compris les messages.
Voici, en guise d'exemple, le fichier batch "Exec.bat".
Il exécutera les scripts sql contenu dans le fichier "MessageToFile.sql" (voir plus bas) à l'aide de SqlCmd.
Les résultats d'exécution sont eux stockés dans le fichier d'output "result.txt":
Cet exemple démontre:
- Que les datasets SQL sont écrits dans le fichier output.
- Que les messages sont écrits dans le fichier output.
- Que les erreurs sont également écrites dans le fichier output :-)
Exec.bat
sqlcmd -U SqlUser -P SqlPassword -S SqlServer -d myDatabase -i MessageToFile.Sql -o result.txtVoici une description sommaire des paramètres (attention: il sont case-sensitive).
- S: Le serveur Sql à contacter.
- U: Le login Sql Server utilisé par SqlCmd. Notez qu'il est possible d'utiliser une "trusted connection" à la place.
- P: Le mot de passe correspondant au login sql.
- d: La base données sur laquelle le script Sql sera exécuté.
- i: Input file, le fichier sql à exécuté. Dans le cas ci-present, ke fichier MessageToFile.Sql se trouve dans le même répertoire que Exec.bat.
- o: Le fichier d'output dans lequel les messages et résultats seront écrits (dans ce cas, rien n'est affiché à l'écran).
MessageToFile.sql
Ce fichier contient les commandes exécutés par Sql Cmd (via le batch Exec.bat)-- Output a message print "Today We are "+Cast( GetDate() as Varchar(30) ) go -- Output a result select top 10 name from sysobjects where name like "DF%A%" go -- Output having a convertion error -- Prooving that error are also written to output file select top 10 Cast( Name as Int ) from sysobjects where name like "DF%A%" go -- Output the final message -- Proving that even with the covertion error, this messahe -- is still logged to the file. print "--- END OF TEST ----"
Result.txt
Today We are Jan 21 2010 11:42AM name -------------------------------------------------------------------------------------------------------------------------------- DF__tblTMProj__Chdat__005FFE8A DF__tblLSSign__Chdat__027D5126 DF__tblDMNumI__ChUse__03A67F89 DF__tblDMNumI__Chdat__049AA3C2 DF__tblDSDocu__ChUse__0524B3A7 DF__tblDSDocu__Chdat__0618D7E0 DF__dtpropert__versi__0697FACD DF__tblRDArm__ChUser__07420643 DF__tblRDArm__Chdate__08362A7C DF__tblDMIFCA__ChUse__095F58DF (10 rows affected) Msg 245, Level 16, State 1, Server myDatabase, Line 3 Conversion failed when converting the nvarchar value 'DF__tblTMProj__Chdat__005FFE8A' to data type int. --- END OF TEST ----
Aucun commentaire:
Enregistrer un commentaire