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

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

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

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

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

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

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

【问题讨论】:

    标签: tabular sql-server-profiler output-formatting


    【解决方案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 分,我将不得不接受一个概述了步骤和更详细的答案。
    • 我认为这些积分会影响 stackoverflow - 它就像 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】:

        试试这个:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-07
          • 1970-01-01
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          相关资源
          最近更新 更多