【问题标题】:Extract db objects dependencies from SSRS dataset with inline query (Query Type : Text)使用内联查询从 SSRS 数据集中提取数据库对象依赖项(查询类型:文本)
【发布时间】:2019-09-16 09:46:33
【问题描述】:

我正在处理识别任何 SSRS RDL 的依赖数据库对象的特定问题。

我非常了解是否有任何数据集在 RDL 中将存储过程作为查询,然后我可以引用关联的存储过程并获取所有依赖对象(详细信息可以在这里找到:Different Ways to Find SQL Server Object Dependencies

但我正在专门寻找带有文本查询或任何 rdl 的内联查询的数据集。我能够从 rdl 的 XML 中提取 CommandText,但我不知道如何提取 db 对象,如 sp、table、views 列形成命令文本,该命令文本是 rdl 中的内联查询。

例如,如果我从 XML commandText 中提取以下查询(这是一个假设的查询,数据库中的名称未标准化,例如 vw_ 用于视图,udf_ 用于函数):

    -----This query serves Report ABC
    SELECT DATE
        ,[amount]
        ,teamID = (SELECT TeamID FROM Sales.[getSalesPerson](r.date) as s WHERE R.[SalesPersonName] = S.[SalesPersonName])
        ,[channel]
        ,[product]
        ,[Item]
        ,r.[M_ID]
        ,Amount
        ,M.[Type]
    FROM dbo.FactTable AS R
    LEFT JOIN sp_Channel C ON R.[Channel_ID] = C.[Channel_ID]
    LEFT JOIN Marketing.vw_M M ON R.[M_ID] = M.[M_ID]

有没有办法确定这个查询有如下依赖对象:

ObjectName                ObjectType
------------------------------------------
dbo.FactTable             Table 
sp_Channel                Stored Procedure
Marketing.vw_M            View
Sales.[getSalesPerson]    Function

【问题讨论】:

  • @DanGuzman - 我可以理解您急于嘲笑这个问题而不是提供有见地的信息(这实际上需要一些努力)。我明确提到这是一个假设查询,表明我可能需要从查询中提取和识别多种类型的对象。在写这个场景时,我想我可能需要用勺子喂每个字,但没想到会为你做(MS MVP)。所以秘诀就是“假设情景”。如果您真的想提供帮助,那么我会说利用您的经验并创造一些可以帮助社区的东西。
  • 您能否对'{from or join} [A-Za-z_]' 进行模式查找,然后捕获空格右侧的所有内容?我认为这至少可以为您提供对象名称?
  • 如何创建视图/函数并将查询包装到该函数中?然后您将拥有物理对象,并且您将能够像通常的视图或功能一样获得所有依赖项
  • 您可以尝试获取执行计划并对其进行解析。里面有所有的对象。

标签: sql sql-server tsql reporting-services xml-parsing


【解决方案1】:

从 SQL 命令中提取对象名称并不容易,因为它们可能以不同的方式编写(有/没有模式,包括数据库名称......)

但是有很多选项可以从 SQL 查询中提取对象,您可以尝试:

  1. 使用正则表达式,例如:您必须搜索位于以下关键字之后的单词:

    • 截断表格
    • 来自
    • 更新
    • 加入

以下代码是一个 C# 示例:

Regex regex = new Regex(@"\bJOIN\s+(?<Retrieve>[a-zA-Z\._\d\[\]]+)\b|\bFROM\s+(?<Retrieve>[a-zA-Z\._\d\[\]]+)\b|\bUPDATE\s+(?<Update>[a-zA-Z\._\d]+)\b|\bINSERT\s+(?:\bINTO\b)?\s+(?<Insert>[a-zA-Z\._\d]+)\b|\bTRUNCATE\s+TABLE\s+(?<Delete>[a-zA-Z\._\d]+)\b|\bDELETE\s+(?:\bFROM\b)?\s+(?<Delete>[a-zA-Z\._\d]+)\b");

var obj = regex.Matches(sql);

foreach(Match m in obj)
{

    Console.WriteLine(m.ToString().Substring(m.ToString().IndexOf(" ")).Trim());

}

输出

然后您必须清理结果并将结果与​​ SQL Server 数据库中的 sys.objects 表连接起来。

  1. 以 SQL 解析器为例:


您可以参考以下非常有用的链接以获取更多信息:

【讨论】:

    【解决方案2】:

    如果您的报告正在连接到 SQLServer 并且您有权访问,您可以尝试使用 SET SHOWPLAN_XML ON 获取执行计划并对其进行解析。

    解析相关线程:extracting-data-from-sql-servers-xml-execution-plan

    【讨论】:

    • 你知道我是否正在运行 SET SHOWPLAN_XML ON 并在我的结果集中获取 xml 那么如何将它插入到表中?我正在努力将 xml 插入表中的列中。
    • 我正在使用动态 sql 来运行几百个查询,并希望将所有查询的执行计划 XML 存储到一个表中。
    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    相关资源
    最近更新 更多