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

Posted

技术标签:

【中文标题】如何将 SQL Server Profiler 2008 的输出转储到类似 CSV 的文件【英文标题】:How to dump an output from SQL Server Profiler 2008 to a CSV-like file 【发布时间】:2011-05-14 13:06:37 【问题描述】:

我正在调试存储过程,现在我感兴趣的是什么以什么顺序运行以及哪些参数,而不是运行速度有多快,以及什么可能潜入并导致减速。

所以,我捕获了几分钟的踪迹。问题是东西太多了,我需要缩小范围。如果我这样做File -> Save As,我会得到以下选项:

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

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

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

那么...有没有更简单的方法?我至少可以以某种方式将其复制到 Excel 中吗?

【问题讨论】:

【参考方案1】:

如果将其保存到跟踪表中;您可以在 SQL Server 中的表中获取数据,这将使您可以随心所欲地操作它;如果仍然需要,包括将其转储到 CSV。文本数据列在表格中完整呈现。


如果您选择保存跟踪表。系统将提示您输入表和数据库的名称。假设您在数据库中将其称为 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'

这会过滤掉非过程调用和您可能有的任何连接重置。您可能需要添加更多过滤器,具体取决于您要执行的操作。

如果您希望将其作为文本文件输出;选择查询 - 要归档的结果并运行查询。这将提示输入文件名并将参数文本作为文本文件提供给您。

【讨论】:

可以将表格复制粘贴到excel中;但你得到的不止一行,这就是我不建议这样做的原因。 谢谢,因为正确答案可以得到大约 150 分,我将不得不接受一个概述了步骤和更详细的答案。 我认为这些积分会影响 *** - 它就像 Boinc - 我有 1400 万积分,但你不能用它们做任何事情,所以为什么要打扰。 嗯,在经济学中,价格向生产者、消费者、员工发出信号信息……在 SO 点中暗示了一个很好的答案。无论如何,谢谢你的回答。它看起来不错 - 让我玩一下。 @u07ch:我同意 Hamish 的观点。如果有人想将他/她的观点提供给其他 SO 成员,那么他必须期待一些好的答案。【参考方案2】:

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

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

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

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

确保您选择选项单个文件中的所有事件

【讨论】:

【参考方案3】:

TL;DR:复制到文本编辑器,手动准备,然后粘贴到 Excel。

我对 SQL Server 的经验很少,所以我不知道这是否适用于其他人,但它适用于我:

在 SQL Server Profiler 中选择所需的行。 Ctrl + C 复制。 粘贴到可以进行正则表达式搜索和替换的纯文本编辑器中(例如我的 Notepad++)。 正则表达式将(N'(''')?[^']*?)\r\n(([^']*?)\r\n)?(([^']*?)\r\n)? 替换为$1 $4 $6 这会清除 SQL 脚本中的所有换行符。 继续执行“全部替换”,直到找不到更多结果。 正则表达式将(Batch(Starting|Completed)[^\\]*?)\r\n 替换为$1 这会清除更多 SQL 内容中的换行符。再次,继续替换,直到没有结果。 正则表达式将\r\nset 替换为set 这会清除审核登录脚本中的所有换行符 你可能需要做更多的替换,你懂的。 使用“文本导入向导”粘贴到 Excel 中。使用制表符作为分隔符。 按第一列排序并删除所有无用的行(例如,在我的情况下为“审核登录”)。您可能还需要在列上手动移动一些数据(例如,在我的情况下为“EntityFramework”数据)

【讨论】:

【参考方案4】:

试试这个:

    打开 SSMS 运行select * from fn_trace_gettable('D:\abc.trc',default) 右键单击并选择标题 将其粘贴到 Excel 中

【讨论】:

以上是关于如何将 SQL Server Profiler 2008 的输出转储到类似 CSV 的文件的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server2012如何打开2016的profiler文件

如何在sql server 2008客户端安装sql profiler

如何设置跟踪定义默认设置 (SQL Server Profiler)

SQL Server Profiler - 如何过滤跟踪以仅显示来自一个数据库的事件?

SQL Server Profiler查询跟踪的简单使用

如何使用SQL Server Profiler跟踪数据库