Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于解析存储过程和提取元数据的C脚本_C#_.net_Sql Server_Regex_Tsql - Fatal编程技术网

C# 用于解析存储过程和提取元数据的C脚本

C# 用于解析存储过程和提取元数据的C脚本,c#,.net,sql-server,regex,tsql,C#,.net,Sql Server,Regex,Tsql,我有大约500个用于ETL过程的存储过程。我被要求识别每个存储过程使用的所有源表和目标表。因此,存储过程可以连接到Oracle链接的服务器或其他SQL服务器。它还可以使用OPENQUERY从事务系统中提取数据 因为我有一些基本的.NET/C编程技能,所以我希望利用.NET正则表达式类开始。然而,我正在寻找关于如何处理这一问题的建议。如果有人已经有了解决方案,我真的不必重新发明轮子 作为上下文,我们正在致力于实现PowerDesigner来存储元数据存储库。因此,我们希望从BI报告中提取元数据,将

我有大约500个用于ETL过程的存储过程。我被要求识别每个存储过程使用的所有源表和目标表。因此,存储过程可以连接到Oracle链接的服务器或其他SQL服务器。它还可以使用OPENQUERY从事务系统中提取数据

因为我有一些基本的.NET/C编程技能,所以我希望利用.NET正则表达式类开始。然而,我正在寻找关于如何处理这一问题的建议。如果有人已经有了解决方案,我真的不必重新发明轮子

作为上下文,我们正在致力于实现PowerDesigner来存储元数据存储库。因此,我们希望从BI报告中提取元数据,将报告映射到它的源表/视图以及Informatica和T-SQL ETL脚本


谢谢

我建议采用双重方法。首先,我要避免将正则表达式用于像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
最后,这个链接看起来对你的情况很有帮助