さまざまなデータインポートシナリオのために、ExcelでSQLステートメント(主にINSERT)を生成するためのトリックはありますか?
私は本当に次のような式を書くのにうんざりしています
="INSERT INTO Table (ID, Name) VALUES (" & C2 & ", '" & D2 & "')"
さまざまなデータインポートシナリオのために、ExcelでSQLステートメント(主にINSERT)を生成するためのトリックはありますか?
私は本当に次のような式を書くのにうんざりしています
="INSERT INTO Table (ID, Name) VALUES (" & C2 & ", '" & D2 & "')"
セミコロンは、最後の二重引用符の内側に閉じパレンを付ける必要があります。文字列を一重引用符で囲む場合は、選択したセルの外側に引用符を追加することを忘れないでください。
(可視性のためにスペースが追加されました-挿入する前に削除してください)
=CONCATENATE("insert into table (id, name) values (",C2,",' ",D2," ');")
別のビューは次のとおりです。
=CONCATENATE("insert into table (id, date, price) values (",C3,",'",D3,"',",B3,");")
以前は、Excel で SQL 挿入を作成するために文字列連結メソッドを使用していました。それはうまく機能しますが、少し時間がかかり、「手間がかかる」こともあります。
Excel から挿入を簡単に生成できる Excel アドインを作成しました。
(ページの下部にあるビデオを参照してください) http://www.howinexcel.com/2009/06/generating-sql-insert-statements-in-excel.html
VBA アプローチは次のようになります。文字列を宣言し、次のように SQL ステートメントを割り当てます。
dim SqlString as String
SqlString = "SELECT * FROM %1 WHERE (var=%2)"
SqlString = Replace("%1", "Table_Name")
SqlString = Replace("%2", ""value"")
Excel のアプローチも同様ですが、SUBSTITUTE
関数を使用します。
SQL テキストが読みやすくなり、煩わしい & および連結の問題がすべて回避されるため、私はこのアプローチを好みます。はい、余分なセルが必要ですが、監査証跡にはそれだけの価値があります。
私はこの痛みを知っています。私はそれについて自分のブログに書くことになりました... 2回。
セルの範囲と複数のオプションを連結する UDF を作成しました。これにより、値は常にコンマで区切られますが、必要に応じて一重引用符や括弧を追加することもできます。
したがって、SQL ステートメントの簡単な部分を記述します。
INSERT INTO table
VALUES /*string that we don't want to type by hand*/
また
SELECT *
FROM table
WHERE foo IN (/*another string I don't want to type out*/)
以下のカスタム Excel 関数は、スプレッドシートの範囲内の値を適切な文字列に変換します。
Function SQLConcat(rng As Range, Optional quoted As Boolean = False, Optional parenthesis As Boolean = False) As String
' ***************************************************************
' * Returns a comma separated list for use in SQL IN statements *
' * Params *
' * - rng: Range of cells to concatenate *
' * - quoted: True/False. If true, values are placed inside *
' * of single quotes. Default of false *
' * - parenthesis: Boolean. *
' * Useful for INSERT INTO tbl VALUES(53),(90),(397) *
' * *
' * Author: Christopher J. McClellan *
' * Published under Creative Commons Attribution-Share Alike *
' * http://creativecommons.org/licenses/by-sa/3.0/ *
' * You are free to change, distribute, and pretty much do *
' * whatever you like with the code, but you must give credit *
' * to the original author and publish any derivitive of this *
' * code under the same license. *
' ***************************************************************
Dim tmp As String 'temporary string
Dim row As Long 'first cell is special case
row = 0 'initalize row count
Dim c As Object 'cell
Dim txtwrapperLeft As String, txtwrapperRight As String
If quoted = True And parenthesis = False Then
txtwrapperLeft = "'"
txtwrapperRight = "'"
ElseIf quoted = True And parenthesis = True Then
txtwrapperLeft = "('"
txtwrapperRight = "')"
ElseIf quoted = False And parenthesis = True Then
txtwrapperLeft = "("
txtwrapperRight = ")"
Else
'quoted = false and parenthesis = false
txtwrapperLeft = ""
txtwrapperRight = ""
End If
For Each c In rng.Cells
If row = 0 Then
tmp = txtwrapperLeft & c.Value & txtwrapperRight
Else
tmp = tmp & "," & txtwrapperLeft & c.Value & txtwrapperRight
End If
row = row + 1
Debug.Print tmp
Next c
'return
SQLConcat = tmp
End Function
場合によっては、SQL 挿入を構築するのが最も簡単な方法のように思えます。しかし、すぐに飽きてしまいます。それを行うための「スマートな」方法はないと思います (おそらくマクロ/VBA プログラミング以外に)。
Excel を避けて、他のアイデアを検討することをお勧めします。
私は昨日これを行っていました。はい、引用符を正しく取得するのは面倒です。私がしたことの1つは、単一引用符だけを含む名前付きセルを作成することでした。A1 ="'"
(等号、二重引用符、一重引用符、二重引用符) と入力し、最下部のツールバーの左側にあるボックスに入力して、このセルに「QUOTE」という名前を付けます。
Excel ファイルを csv 形式でエクスポートすることも、代替オプションの 1 つです (Bill Krawin の投稿を参照してください。新しい投稿者のため、まだコメントを追加できません)。ただし、おそらく日付フィールドのフォーマットを yyyy-mm-dd に変更する必要があることに注意してください。そうしないと、日付列がすべて 00/00/00 と表示されます。これは、MySQL が Microsoft Excel とは異なる日付フォーマットを使用するためです。または、OpenOffice を使用して csv ファイルを保存します。
ACE/Jet (別名 Access) SQL を使用して、Excel ワークブックからソースにデータをクエリして挿入するのはどうですか? これには、別の Excel スプレッドシートである可能性がある ACE/Jet が必要です。簡単な例を次に示します。
INSERT INTO
[ODBC;Driver={SQL Server};SERVER=MYSERVER;DATABASE=MyDatabase;UID=sa;Pwd=mypassword;].MyTable (ID, Name)
SELECT F1, F2
FROM
[Excel 8.0;HDR=NO;IMEX=1;Database=C:\db.xls;].[Sheet1$A1:B4];