sql - 使用 Powershell 和 Regex 生成 SQL
问题描述
我在sql中有以下ddl(数据定义语言)结构:
CREATE TABLE tablename(
key ...,
key1 ...,
u_version ...,
field1 ...,
field2 ...
)
CREATE UNIQUE clustered... (key ASC, key1 ASC)
因为我要创建多个具有该结构的表,所以只有表名、键名和字段名不同。所以我想使用Powershell脚本扫描目录中的每个文件,并为每个文件生成sql脚本。生成的脚本应如下所示:
INSERT INTO tablename(key, key1, u_version, field1, field2)
SELECT key, key1, field1, field2
FROM tablename_temp t
WHERE NOT EXISTS (SELECT key, key1
FROM tablename l
WHERE l.key = t.key AND l.key1 = t.key1)
对于 tablename & table_name_tempdb,我使用以下内容:
switch -Regex ( $line ) {
'(^\s*create\s+table\s+)(?<tablename>[^(]*)' {
$table_name = $matches["tablename"]
$table_name_tempdb="${table_name}_tmp"
break
}
}
现在我想对键和其他字段做同样的事情。有什么建议吗?
我的想法是扫描从 CREATE TABLE 到 ")" 的每一行,并在列表中添加以 " " 开头并以 " " 结尾的每个单词。u_version 之前的行是键,其他行被视为字段并使用它们构建查询。
解决方案
这是一个基于提供的信息的工作示例,它输出新的 SQL。
我调整了你的 SQL(你的插入会失败)。此外,如果您的输入文件与您的示例不同,则表达式将需要调整。
使用 -Raw 读取内容允许将整个文件一起解析。
dir *.sql |%{
$filecontents = Get-Content $_.FullName -Raw
$matches = [Regex]::Match($filecontents, "CREATE TABLE (?'tablename'[^( ]+)\((\W+(?'key'\w+)\W(?'type'[^,)])+[,)])+(\W+u_version\W([^,)])+[,)])(\W+(?'field'\w+)\W(?'type'[^,)])+[,)])+\W+CREATE UNIQUE")
$tablename = $matches.Groups["tablename"].Value
$keys = $matches.Groups["key"].Captures.Value
$fields = $matches.Groups["field"].Captures.Value
'=================================================================='
@"
INSERT INTO $tablename($($keys -join ','), u_version, $($fields -join ','))
SELECT $($keys -join ','), u_version, $($fields -join ',')
FROM $($tablename)_temp t
WHERE NOT EXISTS (SELECT 1
FROM $tablename l
WHERE $(($keys |% { "l.$_ = t.$_" }) -join ' AND '))
"@
}
推荐阅读
- git - Git:强制拉动以覆盖本地更改
- android - 即使页面已成功完成加载,Android WebView 也不显示网页
- ios - 如何在 Swift 中获取推送通知的时间戳?
- html - 如何使 HTML 容器更容易灵活/在移动设备上缩放导航栏
- java - 从接口访问子类
- r - 在R中同时迭代三个列表
- excel - 按单元格值过滤数据模型数据透视表
- tensorflow2.0 - `tf.function` 装饰器导致批处理形状为`NoneType`(Tensorflow2,Python)
- node.js - 在 Node + Express appp 中使用 Mocha 和 Chai 测试 try catch
- java - echo $JAVA_HOME 尽管已在 zshrc 中正确设置,但在 MacOS catalina 中返回空白