Genere SQL con Powershell y Regex
Tengo la siguiente estructura ddl (lenguaje de definición de datos) en sql:
CREATE TABLE tablename(
key ...,
key1 ...,
u_version ...,
field1 ...,
field2 ...
)
CREATE UNIQUE clustered... (key ASC, key1 ASC)
Como quiero crear varias tablas con esa estructura , solo el nombre de las tablas, las claves y los nombres de los campos son diferentes . Entonces quiero usar el script Powershell para escanear cada archivo en el directorio y generar un script sql para cada archivo. El script generado debería verse así:
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 & table_name_tempdb, uso lo siguiente:
switch -Regex ( $line ) { '(^\s*create\s+table\s+)(?<tablename>[^(]*)' { $table_name = $matches["tablename"] $table_name_tempdb="${table_name}_tmp"
break
}
}
Ahora quiero hacer lo mismo con las claves y otros campos. ¿Alguna sugerencia?
Mi idea es escanear todas las líneas desde CREATE TABLE hasta ")" y agregar cada palabra que comience con "" y termine con "" en una lista. Las líneas antes de u_version son claves, las otras se consideran campos y construyen una consulta con ellos.
Respuestas
Aquí hay un ejemplo de trabajo, basado en la información proporcionada, que genera el nuevo SQL.
Te modifiqué SQL (tu inserción tal como está habría fallado). Además, si sus archivos de entrada difieren de su ejemplo, la expresión deberá ajustarse.
Leer contenido con -Raw permite analizar todo el archivo en 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 '))
"@
}