web-dev-qa-db-ja.com

ExcelでSQLステートメントを生成するためのトリック

ExcelでさまざまなデータインポートシナリオのSQLステートメント(主にINSERT)を生成するためのトリックはありますか?

私は本当にのようなもので数式を書くのにうんざりしています

="INSERT INTO Table (ID, Name) VALUES (" & C2 & ", '" & D2 & "')"

18
David Vidmar

セミコロンは、最後の二重引用符内に閉じ括弧を入れる必要があります。文字列を一重引用符で囲む場合は、選択したセルの外側に追加してください。

(可視性のために追加されたスペース-挿入する前に削除)

=CONCATENATE("insert into table (id, name) values (",C2,",' ",D2," ');")

ここに別のビューがあります:

=CONCATENATE("insert into table (id, date, price) values (",C3,",'",D3,"',",B3,");")

31
Jason V

私は以前、文字列連結メソッドを使用してExcelでSQL挿入を作成していました。これはうまく機能しますが、少し時間がかかり、「手間がかかる」こともあります。

Excelからの挿入を簡単に生成できるExcelアドインを作成しました。

(ページの下部にあるビデオを参照してください) http://www.howinexcel.com/2009/06/generating-sql-insert-statements-in-Excel.html

http://www.querycell.com/SQLGenerator.html

http://www.oneclickcommissions.com/Excel-statement.html

2
SamH

連結から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に変換されます。

2

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テキストを読みやすくし、迷惑な&および連結の問題をすべて回避するため、このアプローチを選択します。はい、追加のセルが必要ですが、監査証跡にはそれだけの価値があります。

1
Peter Carswell

私はこの痛みを知っています。結局- ブログで書いて ... 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
1
RubberDuck

Excelファイルをcsvとしてエクスポートすることは、代替オプションになる可能性があります(Bill Krawinの投稿を参照してください-新しいポスターとして、まだコメントを追加することはできません)。ただし、日付フィールドの形式をyyyy-mm-ddに変更する必要がある可能性があることに注意してください。そうしないと、日付列にすべて00/00/00が表示されます。これは、MySQLがMicrosoft Excelとは異なる日付形式を使用するためです。または、OpenOfficeを使用してcsvファイルを保存します。

0
DBMarcos99

SQLテーブルにデータを挿入する場合

=CONCATENATE("INSERT INTO `database_name`.`table_name`(`Column_Name`,`Column_Name`) VALUES ( '",A1,"',",B1,"); ")
0
Vivek Gajbhiye

私は昨日これをしていました、そして、はい、引用符を正しくするのは面倒です。私がしたことの1つは、単一引用符が含まれている名前付きセルを使用することでした。 A1に入力="'"(等号、二重引用符、単一引用符、二重引用符)を選択し、最下部のツールバーの左側にあるボックスに入力して、このセルに「QUOTE」という名前を付けます。

0
WW.

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];
0
onedaywhen

ExcelでSQLを生成するのはなぜですか?ワークシートをCSVファイルとしてエクスポートし、いくつかのツールを使用してそのファイルをSQLデータベースにインポートする方が簡単かつ高速です。たとえば、MySQLの LOAD DATA INFILE ステートメント。

質問に直接回答しないことをお詫びします。これがすべての状況に対する解決策ではないことを知っています。

0
Bill Karwin

SQL Insertsを構築するのが最も簡単な方法のようです。しかし、あなたはすぐにそれに飽きてきて、それを行う「スマート」な方法はないと思います(おそらくマクロ/ VBAプログラミング以外)。

私はあなたにExcelを避けて他のいくつかのアイデアを探求するように指摘します:

  • accessを使用します(大きなcsvインポートフィルター、次にDBテーブルにリンクし、Accessに挿入を処理させます)
  • tOADを使用します(列を組み合わせて一致させることができるため、さらに優れたインポート機能、さらにはクリップボードからインポートすることもできます)
  • sQLローダーを使用します(使用するには少しトリッキーですが、高速でかなり柔軟性があります)。
0
Thorsten