sql-server-2005 – 在脚本中发现来自JOINS的预期外键
发布时间:2020-12-12 16:59:15 所属栏目:MsSql教程 来源:网络整理
导读:我正在继承一个有400个表的数据库,只注册了150个外键约束.知道我对应用程序的处理方式并查看表格列,很容易说应该有更多. 如果我开始添加缺少的FK,我担心当前的应用程序软件将会中断,因为开发人员可能已经开始依赖这种“自由”了,但解决问题的第一步是提出缺少
我正在继承一个有400个表的数据库,只注册了150个外键约束.知道我对应用程序的处理方式并查看表格列,很容易说应该有更多.
如果我开始添加缺少的FK,我担心当前的应用程序软件将会中断,因为开发人员可能已经开始依赖这种“自由”了,但解决问题的第一步是提出缺少FK的列表,以便我们可以将它们评估为一个团队. 更糟糕的是,引用列不共享命名约定. 这些关系是非正式编码到数百个特殊查询和存储过程中的,所以我希望以编程方式解析这些文件,寻找实际表之间的JOINS(但不是表变量等). 我在这种方法中预见的挑战是:换行符,可选别名和表提示,别名解析. >还有更好的想法吗? (除了戒烟) 解决方法强大的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以获取详细信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |