19

对于各种数据导入场景,在 Excel 中生成 SQL 语句(主要是 INSERT)有什么技巧吗?

我真的厌倦了用like写公式

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

4

10 回答 10

32

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

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

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

这是另一种观点:

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

于 2008-11-24T21:28:22.073 回答
2

我曾经使用字符串连接方法在 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

于 2009-07-09T01:07:22.150 回答
2

有时我使用替代来替换 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。

于 2009-07-09T01:24:10.330 回答
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 文本清晰易读,并避免了所有烦人的 & 和连接问题。是的,它需要一个额外的单元格,但对于审计跟踪来说是值得的。

于 2011-04-12T15:31:14.787 回答
1

我知道这种痛苦。我最终在我的博客上写了...两次
我创建了一个 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
于 2015-02-16T20:45:27.193 回答
0

我昨天正在这样做,是的,正确引用引号很烦人。我做的一件事是有一个只包含一个单引号的命名单元格。键入 A1 ="'"(等于、双引号、单引号、双引号),然后通过在最低工具栏左侧的框中键入该单元格来命名此单元格“QUOTE”。

于 2008-11-25T00:28:48.717 回答
0

有时,构建 SQL 插入似乎是最简单的方法。但是你很快就会厌倦它,而且我认为没有“聪明”的方法来做到这一点(除了宏/VBA 编程)。

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

  • 使用 Access(出色的 csv 导入过滤器,然后链接到 DB 表并让 Access 处理插入)
  • 使用 TOAD(更好的导入功能,因为它允许您混合和匹配列,甚至可以从剪贴板导入)
  • 使用 SQL Loader(使用起来有点棘手,但快速且非常灵活)。
于 2008-11-25T17:14:31.837 回答
0

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

于 2009-06-16T11:42:15.763 回答
0

如何使用 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];
于 2009-06-16T13:05:17.187 回答
0

用于将数据插入到 sql 表中

=CONCATENATE("INSERT INTO `database_name`.`table_name`(`Column_Name`,`Column_Name`) VALUES ( '",A1,"',",B1,"); ")
于 2019-02-19T10:43:23.377 回答