如何调整PowerShell正则表达式以正确识别SSIS .dtsx包中的表名
求助:优化正则提取SSIS .dtsx包中的表名
我最近在尝试扫描SSIS的.dtsx包文件,目的是提取里面的SQL语句涉及的表名。我知道正规做法应该用[xml]处理SSIS结构,再配合SQL解析工具,但目前环境限制只能用PowerShell来搞——解析器成本太高,用ANTLR的投入也超出了可接受范围,我需要的是正则优化建议,不是工具推荐哈。
现在遇到两个头疼的问题:
- 像
&.*;这类HTML实体没办法和表名正确分隔,导致捕获的结果里混进了多余的实体内容(比如示例里的ADATABASE2.dbo.TABLEK
TK); dbo.TABLE5完全没被检测到,漏抓了这个表名。
我也清楚硬编码dbo这种架构名不是好主意,会给DBA添管理负担,但当前环境就是这样,先不管这个问题。
我目前用的PowerShell脚本
Get-ChildItem -File -Filter '*.dtsx' | ForEach-Object { $Filename = $_.Name Select-String -Pattern '(FROM|JOIN)(\s|&.*;)+(\S+)(\s|&.*;)+' -Path $_ -AllMatches | ForEach-Object { if ($_.Matches.Groups.captures[3].value -match 'dbo') { "$Filename === $($_.Matches.Groups.captures[3].value)" } } }
.dtsx文件里的示例文本
USE ADATABASE; SELECT * FROM dbo.TABLE1 WHERE F1 = 3; SELECT * FROM dbo.TABLE2 T2 FULL OUTER JOIN dbo.TABLEJ TJ ON T2.KEY = TJ.KEY; SELECT * FROM dbo.TABLE3 T3 INNER JOIN ADATABASE2.dbo.TABLEK
TK ON
T3.user_id = TK.user_id
 SELECT * FROM dbo.TABLE4 T4 FULL OUTER JOIN dbo.TABLE5 T5 ON T4.F1 = T5.F1; EXIT
脚本执行后的结果
sls_test.dtsx === dbo.TABLE1 sls_test.dtsx === dbo.TABLE2 sls_test.dtsx === dbo.TABLEJ sls_test.dtsx === dbo.TABLE3 sls_test.dtsx === ADATABASE2.dbo.TABLEK
TK sls_test.dtsx === dbo.TABLE4
我用的是PowerShell 7.1.5版本,想请教下怎么修改正则表达式,既能排除&.*;这类HTML实体对表名捕获的干扰,又能正确识别出dbo.TABLE5?
内容的提问来源于stack exchange,提问作者lit
相关产品推荐
相关产品推荐

