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获取详细信息.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...