역시나 마찬가지로 이번에는 테이블 생성과 관련하여
정해진 정의서에서 DDL 스크립트를 생성하는 Excel VBA 스크립트다.
check, FK, Indentity 등등은 조금만 코드를 수정하면 가능하리라 본다.
이 스크립트의 경우 DB생성시 collate 를 잘못 설정한 DBA에게 유용하리라 본다.
역시나 대량의 테이블 생성시 시간 낭비를 줄일 수 있다.
파일은 약속된 파일이며 VBA 코드는 일반 모듈에 복붙하여 사용하면 된다.
기준은 하나의 시트(테이블) 씩 생성이나 시트가 역시나 규칙적이라면 순환문으로 이역시 처리가 가능하리라 본다.
[VBA 코드 : 해당 시트를 활성화 후 호출해야 한다.]
Option Explicit
Public Sub makeDDL()
Dim iStart As Integer
Dim iLoop As Integer
Dim iLoop2 As Integer
Dim iadd As Integer
Dim strKey As String
Dim strCollate As String
Dim strLen As String
Dim strNull As String
Dim strDefault As String
Dim strComment(1) As String
Dim iStartComment As Integer
Dim varTable
With ActiveSheet
varTable = Split(.Range("D2").Value, ".")
iStart = Range("B" & Application.Rows.Count).End(xlUp).Row
.Cells(iStart + 2, 2).Value = "CREATE TABLE " & .Range("D2")
.Cells(iStart + 3, 2).Value = "("
For iLoop = 4 To iStart
' PK 체크
If InStr(1, UCase(.Cells(iLoop, 3).Value), "K", vbTextCompare) > 0 Or InStr(1, UCase(.Cells(iLoop, 3).Value), "P", vbTextCompare) > 0 Then
If strKey = "" Then
strKey = .Cells(iLoop, 4).Value
Else
strKey = strKey & "," & .Cells(iLoop, 4).Value
End If
End If
' 문자열 체크 COLLATE , length
If InStr(1, UCase(.Cells(iLoop, 5).Value), "CHAR", vbTextCompare) > 0 Then
strCollate = "COLLATE Korean_Wansung_CS_AS "
strLen = "(" & .Cells(iLoop, 6).Value & ")"
ElseIf InStr(1, UCase(.Cells(iLoop, 5).Value), "INT", vbTextCompare) > 0 Then
strCollate = ""
strLen = ""
ElseIf InStr(1, UCase(.Cells(iLoop, 5).Value), "DECIMAL", vbTextCompare) > 0 _
Or InStr(1, UCase(.Cells(iLoop, 5).Value), "NUMERIC", vbTextCompare) > 0 Then
strCollate = ""
strLen = "(" & .Cells(iLoop, 6).Value & "," & .Cells(iLoop, 7).Value & ")"
Else
strCollate = ""
strLen = ""
End If
' Null 체크
If InStr(1, UCase(.Cells(iLoop, 9).Value), "N", vbTextCompare) > 0 Then
strNull = " NOT NULL "
Else
strNull = " NULL "
End If
' DEFAULT 체크
If InStr(1, UCase(.Cells(iLoop, 8).Value), "BLANK", vbTextCompare) > 0 Or InStr(1, UCase(.Cells(iLoop, 8).Value), Chr(39) & Chr(39), vbTextCompare) > 0 Then
strDefault = "CONSTRAINT DF_" & Replace(Range("D2"), ".", "_") & "_" & .Cells(iLoop, 4).Value & " DEFAULT " & Chr(39) + Chr(39)
ElseIf .Cells(iLoop, 8).Value = "" Then
strDefault = ""
ElseIf InStr(1, UCase(.Cells(iLoop, 8).Value), "GETDATE", vbTextCompare) > 0 Then
strDefault = "CONSTRAINT DF_" & Replace(Range("D2"), ".", "_") & "_" & .Cells(iLoop, 4).Value & " DEFAULT GETDATE()"
ElseIf IsNumeric(.Cells(iLoop, 8).Value) Then
strDefault = "CONSTRAINT DF_" & Replace(Range("D2"), ".", "_") & "_" & .Cells(iLoop, 4).Value & " DEFAULT " & .Cells(iLoop, 8).Value
Else
strDefault = "CONSTRAINT DF_" & Replace(Range("D2"), ".", "_") & "_" & .Cells(iLoop, 4).Value & " DEFAULT " & Chr(39) & Replace(.Cells(iLoop, 8).Value, Chr(39), "") & Chr(39)
End If
If iLoop = 4 Then
.Cells(iStart + iLoop, 2).Value = " " & .Cells(iLoop, 4).Value & " " & .Cells(iLoop, 5).Value & strLen & " " & strCollate & strNull & strDefault
Else
.Cells(iStart + iLoop, 2).Value = " , " & .Cells(iLoop, 4).Value & " " & .Cells(iLoop, 5).Value & strLen & " " & strCollate & strNull & strDefault
End If
Next
If strKey = "" Then
Else
.Cells(iStart + iLoop, 2).Value = " , CONSTRAINT PK_" & Replace(Range("D2"), ".", "_") & " PRIMARY KEY CLUSTERED(" & strKey & ")"
End If
.Cells(iStart + iLoop + 1, 2).Value = ");"
iStartComment = iStart + iLoop + 3
iadd = 4
' 코멘트
.Cells(iStartComment - 1, 2).Value = "EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'" & .Cells(2, 9).Value & _
"', @level0type=N'SCHEMA',@level0name=N'" & varTable(0) & _
"', @level1type=N'TABLE',@level1name=N'" & varTable(1) & "';"
For iLoop2 = iStartComment To iStartComment + iLoop - 5
.Cells(iLoop2, 2).Value = "EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'" & .Cells(iadd, 10).Value & _
"', @level0type=N'SCHEMA',@level0name=N'" & varTable(0) & _
"', @level1type=N'TABLE',@level1name=N'" & varTable(1) & _
"', @level2type=N'COLUMN',@level2name=N'" & .Cells(iadd, 4).Value & "';"
iadd = iadd + 1
Next
End With
End Sub
이 글은 이비니어스( www.evinious.co.kr )의 소유이며 불펌은 허락하지 않습니다.
↓ ↓ ↓ 개발문의는 아래 클릭 ↓ ↓ ↓
'데이터베이스 모델링' 카테고리의 다른 글
모델링 및 쿼리작성 - 신규개발(SI) rule (0) | 2025.04.02 |
---|---|
MS-SQL server 컬럼 수정, 추가, 삭제 VBA 스크립트 (1) | 2025.03.24 |
데이터베이스 모델링 1-4 PRIMARY KEY & UNIQUE (2) | 2025.01.14 |
데이터베이스 모델링 1-3 작명(Naming rule) (2) | 2025.01.02 |
데이터베이스 모델링 1-2 정형 vs 비정형(EAV) (1) | 2024.12.23 |