在Excel中生成SQL语句的技巧

时间:2008-11-24 21:17:55

标签: sql excel vba excel-vba metaprogramming

在Excel中为各种数据导入方案生成SQL语句(主要是INSERT)是否有任何技巧?

我真的厌倦了用类似

编写公式

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

11 个答案:

答案 0 :(得分:31)

分号需要在最后一个双引号内,并且有一个结束语。在字符串周围添加单引号时,请记住将它们添加到所选单元格之外。

(为了可见性添加了空格 - 在插入之前删除)

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

这是另一种观点:

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

答案 1 :(得分:2)

我曾经使用String连接方法在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 :(得分:2)

有时我使用替换来替换SQL命令中的模式,而不是尝试构建脱离串联的sql命令。假设数据在A列和A列中。 B.插入一行。在单元格C1中,使用pattern:

放置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, "')"

另一件让我不止一次咬过的事情是尝试使用excel来处理一些数字的字符或变体,除了它们有前导零(例如007).Excel将转换为数字7。

答案 3 :(得分:1)

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文本清晰易读并避免了所有烦人的问题。并连接问题。是的,它需要一个额外的单元格,但它值得审计跟踪。

答案 4 :(得分:1)

我知道这种痛苦。我结束了writing about it on my blog ... twice 我创建了一个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

答案 5 :(得分:0)

为什么要在Excel中生成SQL?将工作表导出为CSV文件更容易,更快,然后使用某个工具将该文件导入SQL数据库。例如MySQL的LOAD DATA INFILE语句。

不直接回答您的问题而道歉,我知道这不适用于所有情况。

答案 6 :(得分:0)

我昨天这样做了,是的,让报价正确是令人讨厌的。我做的一件事就是有一个只包含单引号的命名单元格。输入A1 ="'"(等于,双引号,单引号,双引号),然后在最下面的工具栏左侧的框中键入该单元格,将其命名为“QUOTE”。

答案 7 :(得分:0)

有时,构建SQL Inserts似乎是最简单的方法。但是你很快就厌倦了,我认为没有“聪明”的方法(除了宏或VBA编程之外)。

我会指出你要避免使用Excel并探索其他一些想法:

  • 使用Access(伟大的csv导入过滤器,然后链接到数据库表并让Access处理插入)
  • 使用TOAD(更好的导入功能,因为它允许您混合和匹配列,甚至从剪贴板导入)
  • 使用SQL Loader(使用起来有点棘手,但速度快且非常灵活)。

答案 8 :(得分:0)

将excel文件导出为csv可以作为替代选项(请参阅Bill Krawin的帖子 - 作为新的海报,我还无法添加评论)。但是请注意,您可能必须将日期字段的格式更改为yyyy-mm-dd,否则日期列将全部显示00/00/00 - 这是因为MySQL使用与Microsoft Excel不同的日期格式。或者使用OpenOffice保存csv文件。

答案 9 :(得分:0)

使用ACE / Jet(a.k.a。Access)SQL查询数据并将数据从Excel工作簿插入源代码怎么样?这需要ACE / Jet,这可能是另一个Excel电子表格。这是一个简单的例子:

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

答案 10 :(得分:0)

用于将数据插入sql表

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