Powershell 및 Regex로 SQL 생성

Sep 14 2020

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 앞의 줄은 키이고 다른 줄은 필드로 간주되어 쿼리를 작성합니다.

답변

1 Graham Sep 14 2020 at 22:51

다음은 제공된 정보를 기반으로 새 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 ')) 
                 

"@

}