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