C# 用于解析存储过程和提取元数据的C脚本
我有大约500个用于ETL过程的存储过程。我被要求识别每个存储过程使用的所有源表和目标表。因此,存储过程可以连接到Oracle链接的服务器或其他SQL服务器。它还可以使用OPENQUERY从事务系统中提取数据 因为我有一些基本的.NET/C编程技能,所以我希望利用.NET正则表达式类开始。然而,我正在寻找关于如何处理这一问题的建议。如果有人已经有了解决方案,我真的不必重新发明轮子 作为上下文,我们正在致力于实现PowerDesigner来存储元数据存储库。因此,我们希望从BI报告中提取元数据,将报告映射到它的源表/视图以及Informatica和T-SQL ETL脚本C# 用于解析存储过程和提取元数据的C脚本,c#,.net,sql-server,regex,tsql,C#,.net,Sql Server,Regex,Tsql,我有大约500个用于ETL过程的存储过程。我被要求识别每个存储过程使用的所有源表和目标表。因此,存储过程可以连接到Oracle链接的服务器或其他SQL服务器。它还可以使用OPENQUERY从事务系统中提取数据 因为我有一些基本的.NET/C编程技能,所以我希望利用.NET正则表达式类开始。然而,我正在寻找关于如何处理这一问题的建议。如果有人已经有了解决方案,我真的不必重新发明轮子 作为上下文,我们正在致力于实现PowerDesigner来存储元数据存储库。因此,我们希望从BI报告中提取元数据,将
谢谢我建议采用双重方法。首先,我要避免将正则表达式用于像SQL查询解析这样复杂的事情,特别是因为有适合这种事情的工具 SMO库公开了一个类,该类允许您连接到服务器并检索给定存储过程的依赖关系树。如何准确地做到这一点留给读者作为练习: 但是,此类不会获取通过动态SQL或OPENQUERY引入的依赖项。如果执行此操作的过程数量较少,我建议手动执行此操作,然后合并结果。您可以使用SMO脚本功能获取OPENQUERY或exec/sp_executesql的所有实例;至少那时你会对“可疑”代码片段有一个概念
合并结果将很棘手。您不仅必须手动更新包含动态依赖项的过程的依赖项,还必须更新依赖于包含动态依赖项的过程的过程 我建议采用双重方法。首先,我要避免将正则表达式用于像SQL查询解析这样复杂的事情,特别是因为有适合这种事情的工具 SMO库公开了一个类,该类允许您连接到服务器并检索给定存储过程的依赖关系树。如何准确地做到这一点留给读者作为练习: 但是,此类不会获取通过动态SQL或OPENQUERY引入的依赖项。如果执行此操作的过程数量较少,我建议手动执行此操作,然后合并结果。您可以使用SMO脚本功能获取OPENQUERY或exec/sp_executesql的所有实例;至少那时你会对“可疑”代码片段有一个概念
合并结果将很棘手。您不仅必须手动更新包含动态依赖项的过程的依赖项,还必须更新依赖于包含动态依赖项的过程的过程 您可以使用动态管理视图从SQL Server本身获取一些依赖项信息,但存在一些限制。不确定Dependency Walker是否利用了此视图,但其优点和缺点非常相似 我所知道并经历过的主要限制是,对于通过动态sql利用的对象,您不会获得任何依赖关系信息。我们已经包含了动态sql的用法,因此我可以非常自信地利用这个DMV并手动计算那些特定过程所命中的对象 我们不做链接服务器,但我的理解是,这些将显示在这个DMV。我不知道OPENQUERY。。。我做了一点研究,但我没有测试出来,但我猜这些不会被这个观点所揭示。正如前面的海报所说,您可能需要双管齐下的方法才能获得所需的一切 仅供参考,一个使用DMV的简单示例:
SELECT DISTINCT
[database] = COALESCE(r.referenced_database_name, DB_NAME())
, [schema] = r.referenced_schema_name
, name = r.referenced_entity_name
, r.referenced_id
FROM sys.dm_sql_referenced_entities('dbo.procName_sp', 'OBJECT') AS r
WHERE r.referenced_id IS NOT NULL;
您可以使用动态管理视图从SQL Server本身获取一些依赖项信息,但存在一些限制。不确定Dependency Walker是否利用了此视图,但其优点和缺点非常相似 我所知道并经历过的主要限制是,对于通过动态sql利用的对象,您不会获得任何依赖关系信息。我们已经包含了动态sql的用法,因此我可以非常自信地利用这个DMV并手动计算那些特定过程所命中的对象 我们不做链接服务器,但我的理解是,这些将显示在这个DMV。我不知道OPENQUERY。。。我做了一点研究,但我没有测试出来,但我猜这些不会被这个观点所揭示。正如前面的海报所说,您可能需要双管齐下的方法才能获得所需的一切 仅供参考,一个使用DMV的简单示例:
SELECT DISTINCT
[database] = COALESCE(r.referenced_database_name, DB_NAME())
, [schema] = r.referenced_schema_name
, name = r.referenced_entity_name
, r.referenced_id
FROM sys.dm_sql_referenced_entities('dbo.procName_sp', 'OBJECT') AS r
WHERE r.referenced_id IS NOT NULL;
我会
不要为此使用C。然而,也许像这样的东西可以完成这项工作
select *
from DatabaseName.information_schema.routines
where routine_type = 'PROCEDURE'
SELECT name, type
FROM dbo.sysobjects
WHERE type IN (
'P', -- stored procedures
'FN', -- scalar functions
'IF', -- inline table-valued functions
'TF' -- table-valued functions
)
ORDER BY type, name
或者,如果需要存储过程和参数:
select * from information_schema.parameters
最后,这个链接看起来对你的情况很有帮助
我不会用C来做这个。然而,也许像这样的东西可以完成这项工作
select *
from DatabaseName.information_schema.routines
where routine_type = 'PROCEDURE'
SELECT name, type
FROM dbo.sysobjects
WHERE type IN (
'P', -- stored procedures
'FN', -- scalar functions
'IF', -- inline table-valued functions
'TF' -- table-valued functions
)
ORDER BY type, name
或者,如果需要存储过程和参数:
select * from information_schema.parameters
最后,这个链接看起来对你的情况很有帮助