web-dev-qa-db-fra.com

Comment vider une sortie de SQL Server Profiler 2008 dans un fichier de type CSV

Je suis en train de déboguer des procédures stockées et je suis maintenant intéressé par ce qui a été exécuté dans quel ordre et par quels paramètres, par opposition à la rapidité d'exécution et ce qui pourrait se glisser entre les deux et causer un ralentissement.

J'ai donc capturé quelques minutes de trace. Le problème, c'est qu'il y a trop de matériel et je dois le réduire. Si je fais File -> Save As, j'obtiens les options suivantes:

  • Fichier de trace ...
  • Modèle de trace ...
  • Table de trace ...
  • Trace XML File ...
  • Trace XML File for Replay ...

Maintenant, ce sont des options décentes, mais ce que je veux vraiment, c’est un format tabulaire, tel que CSV. Je pense que des virgules dans la trace SP dérangeraient probablement le format CSV. J'utiliserais volontiers quelque chose d'autre, tel que || en tant que délimiteur.

Une fois que j'ai le format tabulaire, je peux le filtrer avec grep, etc., puis le traiter facilement avec Python pour voir exactement ce que je veux. J'ai commencé à analyser le fichier XML avec un script, mais je me suis retrouvé à passer trop de temps sur le format de fichier trace XML (je n'ai jamais utilisé la bibliothèque lxml auparavant).

Alors ... y a-t-il un moyen plus facile? Puis-je au moins le copier dans Excel d'une manière ou d'une autre?

37
Hamish Grubijan

Si vous enregistrez dans une table de trace; vous pouvez obtenir les données dans une table dans SQL Server, ce qui vous permettra de les manipuler à votre guise; y compris le vidage vers CSV si toujours nécessaire. La colonne de données texte est entièrement représentée dans la table.


Si vous choisissez Enregistrer Table de trace . Vous serez invité à entrer le nom de la table et de la base de données. Disons que vous l'appelez ProfilerTemp dans le scratch de la base de données.

Entrez ceux-ci; vous pouvez interroger la table en utilisant 

select * from scratch.dbo.ProfilerTemp

Vous verrez tout dans la fenêtre de trace dans la table. Si vous ne filtrez pas uniquement les procédures stockées et souhaitez les sélectionner 

Select textdata from [Scratch].[dbo].[ProfilerTemp] 
  where eventclass = 10 
  And textdata like 'exec %' 
  and not cast(TextData as nvarchar(max))= 'exec sp_reset_connection'

Ceci filtre les appels hors procédure et les éventuelles réinitialisations de connexion. Vous devrez peut-être ajouter plus de filtres en fonction de ce que vous essayez de faire.

Si vous voulez ceci en tant que fichier texte; choisissez la requête - résultats à archiver et à exécuter la requête. Cela vous demandera le nom du fichier et vous donnera le texte du paramètre sous forme de fichier texte.

64
u07ch

TL; DR: Copier dans un éditeur de texte, préparer manuellement, puis coller dans Excel.

J'ai très peu d'expérience avec SQL Server, donc je ne sais pas si cela fonctionnera pour d'autres, mais cela a fonctionné pour moi:

  • Sélectionnez les lignes souhaitées dans SQL Server Profiler. Ctrl + C pour copier.
  • Collez-le dans un éditeur de texte brut capable de rechercher et de remplacer des expressions régulières (par exemple, Notepad ++ dans mon cas).
  • Regex remplace (N'(''')?[^']*?)\r\n(([^']*?)\r\n)?(([^']*?)\r\n)? par $1 $4 $6
    • Cela efface toutes les nouvelles lignes des scripts SQL.
    • Continuez à "Remplacer tout" jusqu'à ce que plus aucun résultat ne soit trouvé.
  • Regex remplace (Batch(Starting|Completed)[^\\]*?)\r\n par $1
    • Cela efface les nouvelles lignes de plus de choses SQL. Encore une fois, continuez à remplacer jusqu'à ce qu'aucun résultat ne soit obtenu.
  • Regex remplace \r\nset par set
    • Ceci efface toutes les nouvelles lignes des scripts Audit Login
  • Vous devrez peut-être faire plus de remplacement, vous voyez l'idée.
  • Coller dans Excel à l'aide de "l'Assistant d'importation de texte". Utilisez des onglets comme déliminateur.
  • Triez par la première colonne et supprimez toutes les lignes inutiles (par exemple, "Audit Login" dans mon cas). Vous devrez peut-être également déplacer manuellement certaines données sur une colonne (par exemple, les données "EntityFramework" dans mon cas).
3
Aaron Campbell

J'avais un tas de fichiers de trace de SQL Profiler contenant des événements de trace d'interblocage que je devais analyser. J'ai fini par les convertir en un seul fichier XML à l'aide de SQL Profiler, puis à lire ce fichier XML avec Python à l'aide des bibliothèques lxml et pandas.

Lorsque les données se retrouvent dans des pandas Dataframe, vous pouvez facilement les convertir en fichiers CSV, Excel, ... ou les analyser en Python (si vous connaissez bien les pandas).

Le script est disponible en tant que Gist . Il est écrit spécifiquement pour les fichiers de trace d'interblocage, car je n'avais aucune autre trace disponible. En d'autres termes, vous aurez peut-être besoin de le modifier légèrement pour atteindre votre objectif. Ne vous inquiétez pas si le fichier XML est volumineux (plusieurs 100 Mo); le script utilise iterparse() , ce qui signifie que le fichier ne sera pas lu en mémoire et que seuls les éléments pertinents seront capturés. Par exemple. un fichier xdl de ca. 220MB ont été analysés en moins de 13 secondes.

Enregistrement des fichiers de trace au format XML (extension xdl):

 Extract

Assurez-vous de sélectionner l’option tous les événements dans un seul fichier.

 Save

0
ƘɌỈSƬƠƑ