如何用PowerShell提取SQL文件中的Database.TableName并生成去重CSV
解决SQL文件表名提取并生成CSV的问题
原命令问题分析
你之前的Select-String命令正则表达式存在两个关键问题:
- 正则逻辑错误:
from|join|update|into\s(\w{100})会把关键字拆分开匹配(比如单独匹配from,或者join,或者update,或者into\s(\w{100})),无法正确匹配每个关键字后跟的表名 - 匹配规则太局限:
\w{100}只能匹配100个连续单词字符,无法匹配database.table这种带点的格式,也没考虑关键字后可能有多个空格、换行,以及可选的schema前缀
正确的PowerShell脚本
以下脚本可实现需求:提取指定SQL文件中FROM/JOIN/UPDATE/INTO后的database.table(自动移除中间的schema前缀),去重后生成包含FileName和Database.TableName的CSV:
# 设置目标SQL文件路径 $sqlPath = "\\shared\path\*.sql" # 设置输出CSV路径 $outputCsv = ".\ExtractedTables.csv" # 正则表达式:匹配不区分大小写的关键字,跳过可选的schema,捕获database.table $pattern = '(?i)\b(from|join|update|into)\s+(?:[\w]+\.)?([\w]+\.[\w]+)\b' # 遍历所有SQL文件,提取匹配项并处理 $results = Get-ChildItem -Path $sqlPath | ForEach-Object { $fileName = $_.Name # 读取文件内容,匹配所有符合规则的表名 $matches = Select-String -Path $_.FullName -Pattern $pattern -AllMatches | ForEach-Object { $_.Matches } # 提取捕获组的表名,去重 $uniqueTables = $matches | ForEach-Object { $_.Groups[2].Value } | Select-Object -Unique # 生成每个表名对应的条目 $uniqueTables | ForEach-Object { [PSCustomObject]@{ FileName = $fileName "Database.TableName" = $_ } } } # 导出到CSV $results | Export-Csv -Path $outputCsv -NoTypeInformation -Encoding UTF8
关键说明
- 正则表达式
(?i)\b(from|join|update|into)\s+(?:[\w]+\.)?([\w]+\.[\w]+)\b:(?i):不区分大小写,兼容FROM/from/From等写法\b:单词边界,避免匹配包含这些关键字的其他单词(比如FROMX)\s+:匹配一个或多个空白字符(包括空格、换行、制表符)(?:[\w]+\.)?:可选的schema前缀(非捕获组,不会被提取),处理类似schema.database.table的格式,自动保留database.table([\w]+\.[\w]+):精准捕获database.table格式的表名
Select-Object -Unique:对每个文件内的重复表名去重Export-Csv:生成标准CSV文件,包含指定的两列
内容的提问来源于stack exchange,提问作者VenkatParkunan
相关产品推荐
相关产品推荐

