对于各种数据导入场景,在 Excel 中生成 SQL 语句(主要是 INSERT)有什么技巧吗?
我真的厌倦了用like写公式
="INSERT INTO Table (ID, Name) VALUES (" & C2 & ", '" & D2 & "')"
对于各种数据导入场景,在 Excel 中生成 SQL 语句(主要是 INSERT)有什么技巧吗?
我真的厌倦了用like写公式
="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, "')"
不止一次让我感到困扰的另一件事是尝试使用 excel 处理一些数字字符或 varchars,除了它们有前导零,例如 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 文本清晰易读,并避免了所有烦人的 & 和连接问题。是的,它需要一个额外的单元格,但对于审计跟踪来说是值得的。
我知道这种痛苦。我最终在我的博客上写了...两次。
我创建了一个 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
我昨天正在这样做,是的,正确引用引号很烦人。我做的一件事是有一个只包含一个单引号的命名单元格。键入 A1 ="'"
(等于、双引号、单引号、双引号),然后通过在最低工具栏左侧的框中键入该单元格来命名此单元格“QUOTE”。
有时,构建 SQL 插入似乎是最简单的方法。但是你很快就会厌倦它,而且我认为没有“聪明”的方法来做到这一点(除了宏/VBA 编程)。
我会指出您避免使用 Excel 并探索其他一些想法:
将 excel 文件导出为 csv 可能是另一种选择(请参阅 Bill Krawin 的帖子 - 作为新海报,我还不能添加评论)。但是请注意,您可能必须将日期字段的格式更改为 yyyy-mm-dd,否则日期列将全部显示 00/00/00 - 这是因为 MySQL 使用与 Microsoft Excel 不同的日期格式。或者使用 OpenOffice 保存 csv 文件。
如何使用 ACE/Jet(又名 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];
用于将数据插入到 sql 表中
=CONCATENATE("INSERT INTO `database_name`.`table_name`(`Column_Name`,`Column_Name`) VALUES ( '",A1,"',",B1,"); ")