본문 바로가기
데이터베이스 모델링

MS-SQL server 컬럼 수정, 추가, 삭제 VBA 스크립트

by 홍보살 2025. 3. 24.

SI건 SM이건 DBA나 모델러를 하다보면 필히 다양한 정의서가 존재한다.
해당 사이트별로 상이하나 엑셀 규격만 맞출 수 있다면
반복적인 혹은 대량의 DDL 문으로 인한 시간 낭비를 줄일 수 있다.

아래는 테이블내 컬럼의 추가, 수정, 삭제시 약속된 엑셀 양식의 정의서에서
VBA 스크립트를 이용해 DDL문을 추가하는 Excel VBA 코드이다.

CECK 제약조건도 종종 사용되지만 구차니즘으로 살짝 제외하였다.
그럼에도 센스있는 데이터 관지자라면 살짝 손봐서 사용이 가능할 것이다.

우선 소스는 아래와 같으며 첨부된 파일에서 DDL 생성하기 클릭시 N,O열에 DDL문과 코멘트 생성 확인이 가능하다.

컬럼추가_수정_삭제_VBA_티스토리.xlsm
0.02MB

 

 

VBA 소스는 아래와 같다.

'## 컬럼 추가/수정
Public Sub makeColumn()

    Dim iLoop As Integer
    Dim iStart As Integer
    Dim iEnd As Integer
    Dim strFlagAdd As String
    Dim strCollate As String
    Dim strDefault As String
    Dim strLen As String
    Dim strNull As String
    Dim strFlagCom As String
    Dim varTable
    
    iStart = 3
    iEnd = Range("B" & Application.Rows.Count).End(xlUp).Row
    
    With ActiveSheet
    
        For iLoop = iStart To iEnd
        
            varTable = Split(.Cells(iLoop, 2).Value, ".")
            
            If InStr(1, Trim(.Cells(iLoop, 3).Value), "추", vbTextCompare) > 0 Or InStr(1, Trim(.Cells(iLoop, 3).Value), "A", vbTextCompare) > 0 Then
                strFlagAdd = " ADD "
                strFlagCom = "add"
            ElseIf InStr(1, Trim(.Cells(iLoop, 3).Value), "수", vbTextCompare) > 0 Or InStr(1, Trim(.Cells(iLoop, 3).Value), "M", vbTextCompare) > 0 Then
                strFlagAdd = " ALTER COLUMN "
                strFlagCom = "update"
            Else
                strFlagAdd = " DROP COLUMN "
                strFlagCom = ""
            End If
            
            
            ' 문자열 체크 COLLATE , length
            If InStr(1, UCase(.Cells(iLoop, 6).Value), "CHAR", vbTextCompare) > 0 Then
            
            
                strCollate = " COLLATE Korean_Wansung_CS_AS "
                strLen = "(" & .Cells(iLoop, 7).Value & ")"
                
            ElseIf InStr(1, UCase(.Cells(iLoop, 6).Value), "INT", vbTextCompare) > 0 Then
            
                strCollate = " "
                strLen = ""
                
            ElseIf InStr(1, UCase(.Cells(iLoop, 6).Value), "DECIMAL", vbTextCompare) > 0 _
            Or InStr(1, UCase(.Cells(iLoop, 6).Value), "NUMERIC", vbTextCompare) > 0 Then
            
                strCollate = " "
                strLen = "(" & .Cells(iLoop, 7).Value & "," & .Cells(iLoop, 8).Value & ")"
                
            Else
                strCollate = ""
                strLen = ""
            End If
            
            ' DEFAULT 체크
            If InStr(1, Trim(.Cells(iLoop, 3).Value), "삭", vbTextCompare) > 0 Or InStr(1, Trim(.Cells(iLoop, 3).Value), "D", vbTextCompare) > 0 Or _
               InStr(1, Trim(.Cells(iLoop, 3).Value), "수", vbTextCompare) > 0 Or InStr(1, Trim(.Cells(iLoop, 3).Value), "M", vbTextCompare) > 0 Then

                strDefault = ";"
            ElseIf InStr(1, UCase(.Cells(iLoop, 9).Value), "BLANK", vbTextCompare) > 0 Or InStr(1, UCase(.Cells(iLoop, 9).Value), Chr(39) & Chr(39), vbTextCompare) > 0 Then
                
                strDefault = "CONSTRAINT DF_" & Replace(.Cells(iLoop, 2).Value, ".", "_") & "_" & .Cells(iLoop, 6).Value & " DEFAULT " & Chr(39) & Chr(39) & " WITH VALUES;"
            
            ElseIf .Cells(iLoop, 10).Value = "" Then

                strDefault = ";"
                
            ElseIf InStr(1, UCase(.Cells(iLoop, 9).Value), "GETDATE", vbTextCompare) > 0 Then
            
                strDefault = "CONSTRAINT DF_" & Replace(.Cells(iLoop, 2).Value, ".", "_") & "_" & .Cells(iLoop, 6).Value & " DEFAULT GETDATE() WITH VALUES;"
                
            ElseIf IsNumeric(.Cells(iLoop, 10).Value) Then
                strDefault = "CONSTRAINT DF_" & Replace(.Cells(iLoop, 2).Value, ".", "_") & "_" & .Cells(iLoop, 6).Value & " DEFAULT " & .Cells(iLoop, 8).Value & " WITH VALUES;"
                
            Else
                strDefault = "CONSTRAINT DF_" & Replace(.Cells(iLoop, 2).Value, ".", "_") & "_" & .Cells(iLoop, 6).Value & " DEFAULT " & Chr(39) & Replace(.Cells(iLoop, 10).Value, Chr(39), "") & Chr(39) & " WITH VALUES;"
                
            End If
            
             ' Null 체크
            If InStr(1, UCase(.Cells(iLoop, 10).Value), "N", vbTextCompare) > 0 Then
                
                strNull = " NOT NULL "

            Else

                strNull = " NULL "
                
            End If
            
            
            If strFlagCom = "" Then
                .Cells(iLoop, 14).Value = "ALTER TABLE " & .Cells(iLoop, 2).Value & strFlagAdd & Trim(.Cells(iLoop, 5).Value) & ";"
            ElseIf strFlagCom <> "" Then
            
                .Cells(iLoop, 14).Value = "ALTER TABLE " & .Cells(iLoop, 2).Value & strFlagAdd & Trim(.Cells(iLoop, 5).Value) & " " & Trim(.Cells(iLoop, 6).Value) & strLen & strCollate & strNull & strDefault
            
                .Cells(iLoop, 15).Value = "EXEC sys.sp_" & strFlagCom & "extendedproperty @name=N'MS_Description', @value=N'" & .Cells(iLoop, 11).Value & _
                         "', @level0type=N'SCHEMA',@level0name=N'" & varTable(0) & _
                         "', @level1type=N'TABLE',@level1name=N'" & varTable(1) & _
                         "', @level2type=N'COLUMN',@level2name=N'" & .Cells(iLoop, 5).Value & "';"
            End If
        Next
    
    End With
    
    
End Sub

 

 

이 글은 이비니어스( www.evinious.co.kr )의 소유이며 불펌은 허락하지 않습니다.

 

    개발문의는 아래 클릭 ↓