如何将 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
,我会得到以下选项:
现在,这些都是不错的选择,但我真正想要的是表格格式,例如 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 文件,使用 lxml
和 pandas
库。
由于数据以 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)