Gerar SQL com Powershell e Regex
Eu tenho a seguinte estrutura ddl (linguagem de definição de dados) em sql:
CREATE TABLE tablename(
key ...,
key1 ...,
u_version ...,
field1 ...,
field2 ...
)
CREATE UNIQUE clustered... (key ASC, key1 ASC)
Porque eu quero criar várias tabelas com essa estrutura , apenas o nome das tabelas, chaves e nomes de campo são diferentes . Portanto, quero usar o script Powershell para verificar cada arquivo no diretório e gerar o script sql para cada arquivo. O script gerado deve ser semelhante a este:
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)
Para tablename e table_name_tempdb, uso o seguinte:
switch -Regex ( $line ) { '(^\s*create\s+table\s+)(?<tablename>[^(]*)' { $table_name = $matches["tablename"] $table_name_tempdb="${table_name}_tmp"
break
}
}
Agora quero fazer o mesmo com as chaves e outros campos. Existe alguma sugestão?
Minha ideia é escanear todas as linhas de CREATE TABLE a ")" e adicionar todas as palavras que começam com "" e terminam com "" em uma lista. As linhas antes de u_version são chaves, as outras são consideradas como campos e constroem a consulta com eles.
Respostas
Aqui está um exemplo prático, com base nas informações fornecidas, que gera o novo SQL.
Eu ajustei seu SQL (sua inserção como está teria falhado). Além disso, se seus arquivos de entrada forem diferentes do seu exemplo, a expressão precisará de ajustes.
Ler o conteúdo com -Raw permite que todo o arquivo seja analisado em conjunto.
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 '))
"@
}