2016-10-19 37 views
0

私は、1つの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 

は、私はこのようなデータを選択します。

SELECT Id, PersonName, DoB, NumberOfChildern FROM Table1; 

私は何を生成したいことは、このような文です:すべての場合

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

フィールドは常に埋め込まれているので、コードを一度書くことができます。それだけです。ただし、2つのフィールドにデータが含まれている場合や、データが含まれていない場合は問題があります。この文の4つの異なるバージョンがすでに存在しているNULL値が含まれており、多くのフィールドで、それはより多くなるとできるだけで2つのフィールドを持つ

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

関連する問題