2016-10-19 4 views
0

한 Access 데이터베이스에서 다른 국가의 다른 데이터로 데이터 (단일 레코드)를 내보내는 것을 좋아합니다. 아이디어는 전자 메일마다 INSERT INTO 문을 사용하여 텍스트 파일을 보내고받는 PC가이 INSERT INTO 문을 실행한다는 것입니다. 필자는 이미이 텍스트 파일에서 INSERT INTO 문을 읽고 실행하는 코드를 작성했습니다.MS-Access에서 INSERT INTO 문 생성

분명히 INSERT INTO 문을 생성해야합니다.

다음은 예입니다.

Table1 
Id    number 
PersonName  text 
DoB    date, can be empty 
NumberOfChildern number, can be empty 

내가 데이터를 다음과 같이 선택합니다 : I 생성 할 무엇

SELECT Id, PersonName, DoB, NumberOfChildern FROM Table1; 

이 같은 진술은 다음과 같습니다 모든 경우

INSERT INTO Table1 (Id, PersonName, DoB, NumberOfChildern) VALUES (1, ‘Peter’, #5-17-1990#, 1) 

나는 다음과 같은 테이블이 필드가 항상 채워지면 코드를 한 번 작성하면됩니다. 그러나 두 개의 필드에 데이터가 있거나 데이터가 포함되어 있지 않은 경우 문제가 있습니다. 이 문장의 4 개 가지 버전이 이미 거기에 NULL 값을 포함 할 수 있습니다 단지 두 개의 필드로

INSERT INTO Table1 (Id, PersonName, DoB, NumberOfChildern) VALUES (1, ‘Peter’, #5-17-1990#, 1) 
INSERT INTO Table1 (Id, PersonName, NumberOfChildern) VALUES (1, ‘Peter’, 1) 
INSERT INTO Table1 (Id, PersonName, DoB) VALUES (1, ‘Peter’, #5-17-1990#) 
INSERT INTO Table1 (Id, PersonName) VALUES (1, ‘Peter’) 

더 필드는 점점 더된다 : 여기

약간 비슷하지만 다른 위의 문장의 버전입니다 복잡한 (실제로 복잡하지는 않지만 더 많은 작업).

VBA에서 테이블과 레코드를 분석하여 어떤 종류의 필드 (예 : 날짜)가 사용되었는지 확인하고 위와 같은 문을 생성하는 코드를 작성하는 것에 대해 생각합니다. 나는 이것을 할 수있을 것이라고 확신하지만 다른 사람들이 전에 이것을했을지 궁금해. 나는 바퀴를 재발 명하고 싶지 않다. "SQL insert 문 생성"은 실제로 효율적이지 않습니다.

아이디어가 있으십니까?

답변

3

운이 좋은 날입니다. SQL Server에서이 작업을 수행했습니다. Access SQL에서 작동해야하는 몇 가지 수정 사항이 있습니다.

키가 VALUES NULL을 삽입하고 값이 null 인 경우 다른 명령문을 작성하지 않습니다.

아마도 Access에는 SET IDENTITY_INSERT ON/OFF이 필요하지 않습니다.

Gustav는 모든 Sqlify/SqlDate 등 헬퍼 함수를 ​​대체하고 더 많은 데이터 형식을 처리 할 수있는 generic function을 게시했습니다.

Public Sub InsertStatementsSql(ByVal sTABLE As String) 

    Dim DB As DAO.Database 
    Dim TD As DAO.TableDef 
    Dim RS As DAO.Recordset 
    Dim fld As DAO.Field 
    Dim sKpl As String 
    Dim sStart As String 
    Dim sValues As String 
    Dim S As String 
    Dim v As Variant 
    Dim i As Long 
    Dim bIdentity As Boolean 

    Set DB = CurrentDb 
    Set TD = DB.TableDefs(sTABLE) 
    Set RS = DB.OpenRecordset(sTABLE, dbOpenSnapshot) 


    ' Check for Autonumber/IDENTITY column 
    bIdentity = False 
    For i = 0 To TD.Fields.count - 1 
     If (TD.Fields(i).Attributes And dbAutoIncrField) > 0 Then 
      bIdentity = True 
      Exit For 
     End If 
    Next i 

    If bIdentity Then 
     sKpl = sKpl & "SET IDENTITY_INSERT " & sTABLE & " ON;" & vbCrLf & vbCrLf 
    End If 

    ' "INSERT INTO ... VALUES " for every line 
    For i = 0 To TD.Fields.count - 1 
     sStart = StrAppend(sStart, TD.Fields(i).Name, ", ") 
    Next i 
    sStart = "INSERT INTO " & sTABLE & " (" & sStart & ") VALUES " 

    ' One line per record 
    Do While Not RS.EOF 
     sValues = "" 
     For i = 0 To TD.Fields.count - 1 
      v = RS(i) 
      If IsNull(v) Then 
       S = "NULL" 
      Else 
       Set fld = TD.Fields(i) 
       Select Case fld.Type 
        Case dbText, dbMemo: S = Sqlify(CStr(v)) 
        Case dbDate: S = SqlDate(CDate(v)) 
        Case dbDouble, dbSingle: S = SqlNumber(CDbl(v)) 
        Case Else: S = CStr(v) 
       End Select 
      End If 
      sValues = StrAppend(sValues, S, ", ") 
     Next i 
     ' Append line to full SQL 
     sKpl = sKpl & vbCrLf & sStart & " (" & sValues & ");" 
     RS.MoveNext 
    Loop 
    RS.Close 
    Set TD = Nothing 

    If bIdentity Then 
     sKpl = sKpl & vbCrLf & vbCrLf & "SET IDENTITY_INSERT " & sTABLE & " OFF;" & vbCrLf 
    End If 

    Debug.Print sKpl 

    ' see https://support.microsoft.com/en-us/kb/210216 or https://msdn.microsoft.com/en-us/library/office/ff192913.aspx 
    ' or https://stackoverflow.com/a/25431633/3820271 
    'ClipBoard_SetData sKpl 

End Sub 

' ------------------- helper functions ----------------- 

' ein'string --> 'ein''string' 
Public Function Sqlify(ByVal S As String) As String 

    S = Replace(S, "'", "''") 
    S = "'" & S & "'" 
    Sqlify = S 

End Function 

Public Function SqlDate(vDate As Date) As String 
    SqlDate = "#" & Format(vDate, "yyyy-mm-dd") & "#" 
End Function 

Public Function SqlNumber(num As Double) As String 
    SqlNumber = Replace(CStr(num), ",", ".") 
End Function 

Public Function StrAppend(sBase As String, sAppend As Variant, sSeparator As String) As String 

    If Len(sAppend) > 0 Then 
     If sBase = "" Then 
      StrAppend = Nz(sAppend, "") 
     Else 
      StrAppend = sBase & sSeparator & Nz(sAppend, "") 
     End If 
    Else 
     StrAppend = sBase 
    End If 

End Function 
+0

와우! 나의 운이 좋은 날이다. 난 그냥 시도하고 복사 및 붙여 넣기 NULL 값을 가진 SQL 문을 잘 작동합니다. 여기에 "INSERT INTO Table1 (ID, PersonName, DoB, NumberOfChildern) VALUES (3, 'Edgar', NULL, NULL);" – Edgar