Powershell ve Regex ile SQL oluşturun
Sql'de aşağıdaki ddl (Veri tanımlama dili) yapısına sahibim:
CREATE TABLE tablename(
key ...,
key1 ...,
u_version ...,
field1 ...,
field2 ...
)
CREATE UNIQUE clustered... (key ASC, key1 ASC)
Bu yapıyla birden çok tablo oluşturmak istediğim için , yalnızca tabloların adı, anahtarları ve alan adları farklıdır . Bu yüzden dizindeki her dosyayı taramak ve her dosya için sql betiği oluşturmak için Powershell betiğini kullanmak istiyorum. Oluşturulan komut dosyası şöyle görünmelidir:
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 için aşağıdakileri kullanıyorum:
switch -Regex ( $line ) { '(^\s*create\s+table\s+)(?<tablename>[^(]*)' { $table_name = $matches["tablename"] $table_name_tempdb="${table_name}_tmp"
break
}
}
Şimdi aynısını anahtarlar ve diğer alanlar için yapmak istiyorum. Herhangi bir öneri var mı?
Benim fikrim, CREATE TABLE'den ")" a kadar her satırı taramak ve "" ile başlayan ve "" ile biten her kelimeyi bir listeye eklemek. U_version'dan önceki satırlar anahtardır, diğerleri alan olarak kabul edilir ve bunlarla sorgu oluşturur.
Yanıtlar
Burada, yeni SQL çıktısını veren, sağlanan bilgilere dayalı çalışan bir örnek verilmiştir.
Size SQL'de ince ayar yaptım (olduğu gibi ekiniz başarısız olurdu). Ayrıca, giriş dosyalarınız örneğinizden farklıysa, ifadede ince ayar yapılması gerekecektir.
İçeriği -Raw ile okumak, tüm dosyanın birlikte ayrıştırılmasına izin verir.
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 '))
"@
}