gpt4 book ai didi

sql - 使用内联查询从 SSRS 数据集中提取数据库对象依赖项(查询类型 : Text)

转载 作者:行者123 更新时间:2023-12-02 09:34:11 24 4
gpt4 key购买 nike

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

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

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

例如,如果我从 XML commandText 中提取以下查询(这是一个假设的查询,数据库中的名称未标准化,例如 vw_ 用于 View ,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

最佳答案

从 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());

}

输出

enter image description here

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

  • 使用 SQL 解析器,例如:

  • <小时/>

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

    关于sql - 使用内联查询从 SSRS 数据集中提取数据库对象依赖项(查询类型 : Text),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55875056/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com