微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server-2005 – 在脚本中发现来自JOINS的预期外键

我正在继承一个有400个表的数据库,只注册了150个外键约束.知道我对应用程序的处理方式并查看表格列,很容易说应该有更多.

如果我开始添加缺少的FK,我担心当前的应用程序软件将会中断,因为开发人员可能已经开始依赖这种“自由”了,但解决问题的第一步是提出缺少FK的列表,以便我们可以将它们评估为一个团队.

更糟糕的是,引用列不共享命名约定.

这些关系是非正式编码到数百个特殊查询和存储过程中的,所以我希望以编程方式解析这些文件,寻找实际表之间的JOINS(但不是表变量等).

在这方法中预见的挑战是:换行符,可选别名和表提示,别名解析.

>还有更好的想法吗? (除了戒烟)
>是否有任何预先构建的工具可以解决这个问题?
>我不认为正则表达式可以解决这个问题.你不同意吗?
> sql解析器?我尝试使用Microsoft.sqlServer.Management.sqlParser.Parser,但所有暴露的是词法分析器 – 无法从中获取AST – 所有内容都是内部的.

解决方法

强大的sql Parser可以帮助自动分析数百个ad-hoc查询和存储过程,并且从sql Parser生成查询解析树中,可以轻松找到变量表/列的关系.

这是样本:

SELECT a.ASSMT_NO,b.LINK_ParaM,c.EXPL                                               AS LINK_PG,(SELECT count()
    FROM   GRAASPST t
    WHERE  t.ASSMT_NO = a.ASSMT_NO
           AND t.ROLE != '02')                          AS PSN_CNT,(SELECT count()
    FROM   GRAASPST t
    WHERE  t.ASSMT_NO = a.ASSMT_NO
           AND t.ROLE != '02'
           AND ASSMT_FIN_YN = 'Y')                      AS PSN_FIN_CNT,(SELECT Avg(assmt_pts)
    FROM   GRAASSMT t
    WHERE  t.ASSMT_NO = a.ASSMT_NO
           AND t.ASSMT_TGT_SEQ_NO = a.ASSMT_TGT_SEQ_NO) AS ASSMT_PTS_AVG,a.ASSMT_RES,a.ASSMT_RPT_SUB_TITLE
FROM   GRAASTAT a
   JOIN GRAASRET b
     ON b.DELIB_REQ_NO = a.DELIB_REQ_NO
   JOIN GRTCODDT c
     ON c.DIV_CD = 'GR013'
        AND c.CD = b.DELIB_SLCT
   JOIN CMUSERMT d
     ON d.USERID = a.REGID
WHERE  a.ASSMT_NO = :ASSMT_NO
ORDER  BY a.ASSMT_TGT_SEQ_NO

分析此查询后,您可能会得到以下内容

JoinTable1         JoinColumn1       JoinTable2    JoinColumn2     
GRAASRET       DELIB_REQ_NO      GRAASTAT      DELIB_REQ_NO    
GRTCODDT       CD            GRAASRET      DELIB_SLCT      
CMUSERMT       USERID        GRAASTAT      REGID              
GRAASPST       ASSMT_NO      GRAASTAT      ASSMT_NO        
GRAASSMT       ASSMT_NO      GRAASTAT      ASSMT_NO        
GRAASSMT       ASSMT_TGT_SEQ_NO  GRAASTAT      ASSMT_TGT_SEQ_NO

您可以查看this demo获取详细信息.

原文地址:https://www.jb51.cc/mssql/80671.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐