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
連結からsqlコマンドを構築しようとするのではなく、SQLコマンドのパターンを置き換えるために時々代替を使用します。データがA列とB列にあるとします。一番上の行を挿入します。セルC1に、パターンを使用してSQLコマンドを配置します。
insert into table t1 values('<<A>>', '<<B>>')
次に、行2にExcelの数式を配置します。
=SUBSTITUTE(SUBSTITUTE($C$1, "<<A>>", A2), "<<B>>", B2)
絶対セルアドレス指定の使用に注意してください$C$1
パターンを取得します。 charまたはvarcharを使用していて、連結で一重引用符と二重引用符を混在させる必要がある場合は特に便利です。と比較:
=concatenate("insert into table t1 values '", A2, "', '", B2, "')"
もう1つ私を悩ませたのは、Excelを使用して、いくつかの文字またはvarchar(数値など)を処理しようとすることです。ただし、それらには007などの先行ゼロがあります。Excelは数値7に変換されます。
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
Excelファイルをcsvとしてエクスポートすることは、代替オプションになる可能性があります(Bill Krawinの投稿を参照してください-新しいポスターとして、まだコメントを追加することはできません)。ただし、日付フィールドの形式をyyyy-mm-ddに変更する必要がある可能性があることに注意してください。そうしないと、日付列にすべて00/00/00が表示されます。これは、MySQLがMicrosoft Excelとは異なる日付形式を使用するためです。または、OpenOfficeを使用してcsvファイルを保存します。
SQLテーブルにデータを挿入する場合
=CONCATENATE("INSERT INTO `database_name`.`table_name`(`Column_Name`,`Column_Name`) VALUES ( '",A1,"',",B1,"); ")
私は昨日これをしていました、そして、はい、引用符を正しくするのは面倒です。私がしたことの1つは、単一引用符が含まれている名前付きセルを使用することでした。 A1に入力="'"
(等号、二重引用符、単一引用符、二重引用符)を選択し、最下部のツールバーの左側にあるボックスに入力して、このセルに「QUOTE」という名前を付けます。
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];
ExcelでSQLを生成するのはなぜですか?ワークシートをCSVファイルとしてエクスポートし、いくつかのツールを使用してそのファイルをSQLデータベースにインポートする方が簡単かつ高速です。たとえば、MySQLの LOAD DATA INFILE
ステートメント。
質問に直接回答しないことをお詫びします。これがすべての状況に対する解決策ではないことを知っています。
SQL Insertsを構築するのが最も簡単な方法のようです。しかし、あなたはすぐにそれに飽きてきて、それを行う「スマート」な方法はないと思います(おそらくマクロ/ VBAプログラミング以外)。
私はあなたにExcelを避けて他のいくつかのアイデアを探求するように指摘します: