如何将SQL Server Profiler 2008的输出转储到类似CSV的文件中

48

我正在调试存储过程,现在我想知道每个过程运行的顺序和使用了哪些参数,而不是关心执行速度和可能导致减缓的问题。

因此,我捕获了几分钟的跟踪信息。问题是有太多的内容,我需要将其缩小范围。如果我选择 文件 -> 另存为,会出现以下选项:

  • 跟踪文件...
  • 跟踪模板...
  • 跟踪表...
  • 跟踪XML文件...
  • 用于重放的跟踪XML文件...

这些选项还不错,但我真正想要的是表格格式,比如CSV。我认为,在SP跟踪中使用逗号可能会破坏CSV格式。 我很乐意使用其他东西,比如||作为分隔符。

一旦我有了表格格式,我可以使用grep等工具对其进行筛选,然后使用Python轻松处理以查看我想要的确切信息。我开始用脚本解析XML文件,但发现自己花费太多时间在跟踪XML文件格式上(之前没有使用lxml库)。

那么...有更简单的方法吗?我是否可以将其复制到Excel中?

4个回答

72
如果你将它保存到跟踪表中,你就可以在 SQL Server 中以表格形式获取数据,从而随心所欲地进行操作,包括如果仍然需要的话将其转储为 CSV。文本数据列在表格中得到了充分的代表。
如果选择 保存跟踪表,会提示你输入表格和数据库的名称。假设你在 scratch 数据库中将其命名为 ProfilerTemp。
输入这些信息后,你可以使用查询语句对该表格进行查询。
select * from scratch.dbo.ProfilerTemp

在跟踪窗口中,您将在表格中看到所有内容。如果您没有筛选到仅存储过程并且只想选择它们,则可以这样做。

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

这将过滤掉非过程调用和可能存在的连接重置。根据您的需求,您可能需要添加更多过滤器。

如果您想将其输出为文本文件,请选择查询 - 结果到文件并运行查询。这将提示输入文件名并将参数文本作为文本文件给出。


1
谢谢,由于正确答案可以得到约150分,我必须接受一个有详细步骤的答案。 - Hamish Grubijan
1
我认为积分对于stackoverflow来说是一个负面因素 - 就像Boinc一样 - 我有1400万积分,但你不能用它们做任何事情,所以为什么要费心去获得呢。 - u07ch
1
@u07ch:我同意Hamish的观点。如果有人想把他/她的分数给其他的SO成员,那么他必须期望得到一些好的答案。 - santosh singh
为什么EventClass = 10? - DevDave
最初的问题与存储过程分析有关,而EventClass 10则返回过程。 - u07ch
显示剩余5条评论

4
TL;DR: 复制到文本编辑器中,手动准备,然后粘贴到Excel中。
我对SQL Server的经验非常有限,所以我不知道这是否适用于其他人,但对我来说是有效的:
1.在SQL Server Profiler中选择所需的行。按Ctrl + C复制。
2.将其粘贴到一个可以进行正则表达式搜索和替换的纯文本编辑器中(例如Notepad ++)。
3.使用正则表达式 (N'('')?[^']*?)\r\n(([^']*?)\r\n)?(([^']*?)\r\n)? 将其替换为 $1 $4 $6 - 这会清除SQL脚本中的所有换行符。 - 一直执行“全部替换”操作,直到没有更多结果被找到。
4.使用正则表达式 (Batch(Starting|Completed)[^\\]*?)\r\n 将其替换为 $1 - 这会清除更多SQL内容中的换行符。同样,一直执行替换操作,直到没有结果。
5.使用正则表达式 \r\nset 将其替换为 set - 这会清除Audit Login脚本中的所有换行符。
6.您可能需要进行更多替换,但您已经明白了。
7.使用“文本导入向导”将其粘贴到Excel中。使用制表符作为分隔符。
8.按第一列排序并删除任何无用的行(例如我的情况下的“Audit Login”)。您可能还需要手动将一些数据移到另一列(例如我的情况下的“EntityFramework”数据)。

3

请尝试以下步骤:

  1. 打开SSMS
  2. 运行 select * from fn_trace_gettable('D:\abc.trc',default)
  3. 右键点击并选择“包括标题”
  4. 将其粘贴到Excel中

0

我有一堆包含死锁跟踪事件的SQL Profiler跟踪文件需要分析。最终,我使用SQL Profiler将它们转换为单个XML文件,然后使用Python中的和库读取该XML文件。

由于数据最终以pandas Dataframe形式出现,因此您可以轻松地将其转换为CSV、Excel等格式或在Python中进行分析(如果您熟悉pandas)。

该脚本可作为gist使用。它是专门针对死锁跟踪文件编写的,因为我没有其他跟踪文件可用。换句话说,您可能需要稍微调整一下才能达到您的目的。如果XML文件很大(几百MB),也不用担心;该脚本使用iterparse(),这意味着文件不会被读入内存,只有相关元素会被捕获。例如,一个大约220MB的xdl文件在不到13秒的时间内被解析。

将跟踪文件保存为 XML(xdl 扩展名):

Extract

请确保选择选项所有事件在单个文件中

Save


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接