Genera SQL con Powershell e Regex
Ho la seguente struttura ddl (Data definition language) in sql:
CREATE TABLE tablename(
key ...,
key1 ...,
u_version ...,
field1 ...,
field2 ...
)
CREATE UNIQUE clustered... (key ASC, key1 ASC)
Poiché desidero creare più tabelle con quella struttura , solo il nome delle tabelle, delle chiavi e dei nomi dei campi sono diversi . Quindi voglio usare lo script Powershell per scansionare ogni file nella directory e generare script sql per ogni file. Lo script generato dovrebbe assomigliare a questo:
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)
Per tablename e table_name_tempdb, utilizzo quanto segue:
switch -Regex ( $line ) { '(^\s*create\s+table\s+)(?<tablename>[^(]*)' { $table_name = $matches["tablename"] $table_name_tempdb="${table_name}_tmp"
break
}
}
Ora voglio fare lo stesso con le chiavi e altri campi. Ci sono suggerimenti?
La mia idea è di scansionare ogni riga da CREATE TABLE a ")" e aggiungere ogni parola che inizia con "" e finisce con "" in un elenco. Le righe prima di u_version sono chiavi, le altre sono considerate come campi e costruiscono query con quelle.
Risposte
Ecco un esempio funzionante, basato sulle informazioni fornite, che restituisce il nuovo SQL.
Ti ho modificato SQL (il tuo inserimento così com'è avrebbe fallito). Inoltre, se i tuoi file di input differiscono dal tuo esempio, l'espressione dovrà essere modificata.
La lettura del contenuto con -Raw consente di analizzare l'intero file insieme.
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 '))
"@
}