从Excel工作表生成SQL插入脚本

150

我有一个大型的Excel工作表,想要将其添加到我的数据库中。

我是否可以从这个Excel工作表生成一个SQL插入脚本?


你也可以使用我的VBA宏来生成SQL命令。更多信息请参见:http://stackoverflow.com/questions/1570387/how-to-insert-data-from-an-excel-sheet-into-a-database-table/37409790#37409790 - Petrik
如果您不想编写代码或维护它,这个应用程序会自动将表格中的行插入/更新到SQL中。 - howMuchCheeseIsTooMuchCheese
13个回答

266

如果确实是一个大文件,我认为使用提到的方法之一进行导入是理想的,但您可以使用Excel创建插入语句:

="INSERT INTO table_name VALUES('"&A1&"','"&B1&"','"&C1&"')"

在 MS SQL 中,您可以使用:

SET NOCOUNT ON
放弃显示所有的“1 行受影响”的注释。如果您正在处理大量行并且出现错误,请在语句之间偶尔放置一个 GO。 答案:

放弃显示所有的“1 行受影响”的注释。如果您正在处理大量行并且出现错误,请在语句之间偶尔放置一个 GO。


3
وˆ‘ن¹‹ه‰چهœ¨ن½؟用=CONCATENATE(),ن½†وک¯ن½؟用&符هڈ·هڈ¯ن»¥è®©ه†…ه®¹و›´وک“读ï¼پ - mastazi
2
@mastazi 同意!我以前遇到 CONCATENATE() 参数限制时已经转换为 &了,现在由于参数限制为255个而不再是常见问题,但我从来没有想过要恢复。 - Hart CO
1
CONCATENATE()是最好的选择。只需单击公式栏上的fx图标即可查看您输入的内容。它比仅使用&符号更清晰。当然,使用&符号很酷,但有时当您有双引号或单引号时,这会让您一直数缺少了什么。 - ian0411
1
在单元格中包含引号时无法正常工作。请检查我的答案以获取已更正的版本。 - Simon Baars
2
@PreshanPradeepa,您可以使用相同的语法,SQL Server 不在乎整数是否带引号,只要它是有效的整数即可。 - Hart CO
显示剩余5条评论

36

23
不要在网上发布您的敏感数据。您无法知道提交给网络应用程序的数据会发生什么。其中一些工具会存储您的数据并公开发布。 - GabiM

35
您可以通过管理工作室界面创建一个合适的表格,并像下面所示插入数据。根据数据数量的不同,可能需要一些时间,但非常方便。 输入图像描述 输入图像描述

1
如果您在Excel表格中没有指定IDENTITY值,您可以通过删除IDENTITY列来更改和重新运行编辑前200行SQL脚本。因此,当您复制并粘贴没有IDENTITY的值时,此方法将起作用。 - aozan88
这不是真的 :) 你只需要使用适合你系统的日期/时间格式即可。 - Andrey Morozov
对于IDENTITY - 记得包括一个额外的空白左侧列。这将允许正确的种子生成。参考链接:https://sqlspreads.com/2017/05/04/how-to-insert-data-in-excel-to-sql-server/ - Jay
@AndreyMorozov 我能通过“编辑”给你的答案添加更多细节吗?例如,我想添加一些步骤来展示如何格式化日期,如何将字符串括在单引号中(包括日期值)-以及如何修改SQL以省略身份种子列。请给予建议。 - qxotk
1
@condiosluzverde 我建议你发布自己的答案。如果编辑此答案,你的更改可能会被社区管理员拒绝。 - Andrey Morozov
显示剩余3条评论

21
您可以使用以下的Excel语句:
="INSERT INTO table_name(`"&$A$1&"`,`"&$B$1&"`,`"&$C$1&"`, `"&$D$1&"`) VALUES('"&SUBSTITUTE(A2, "'", "\'")&"','"&SUBSTITUTE(B2, "'", "\'")&"','"&SUBSTITUTE(C2, "'", "\'")&"', "&D2&");"

这个方案比Hart CO的回答更好,因为它考虑了列名并且消除了由于列中引号导致的编译错误。最后一列是一个数值列的示例,不需要引号。


5
使用PowerShell Gallery中的ImportExcelConvertFrom-ExcelToSQLInsert将Excel转换为SQL插入语句。
NAME
    ConvertFrom-ExcelToSQLInsert
SYNTAX
    ConvertFrom-ExcelToSQLInsert [-TableName] <Object> [-Path] <Object> 
      [[-WorkSheetname] <Object>] [[-HeaderRow] <int>] 
      [[-Header] <string[]>] [-NoHeader] [-DataOnly]  [<CommonParameters>]
PARAMETERS
    -DataOnly
    -Header <string[]>
    -HeaderRow <int>
    -NoHeader
    -Path <Object>
    -TableName <Object>
    -WorkSheetname <Object>
    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see
        about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).
ALIASES
    None
REMARKS
    None
EXAMPLE
    ConvertFrom-ExcelToSQLInsert MyTable .\testSQLGen.xlsx

5

3
可以使用SSMS的导入向导将Excel文件导入到MS SQL中。 - Hart CO
1
为了补充@HartCO的细节 - 要导航到SSMS导入向导,请右键单击数据库,将鼠标悬停在任务上,单击上下文菜单底部附近的“导入数据...”。按照向导中的步骤进行操作。 - qxotk

2

你可以使用VB编写一些内容,逐行输出到文件中,在你的数据周围添加适当的SQL语句。我之前已经做过了。


1
您可以使用以下C#方法来生成插入脚本,只需在执行该方法之前从NuGet软件包管理器中导入OfficeOpenXml软件包即可。
public string GenerateSQLInsertScripts() {

        var outputQuery = new StringBuilder();
        var tableName = "Your Table Name";
        if (file != null)
        {
            var filePath = @"D:\FileName.xsls";

            using (OfficeOpenXml.ExcelPackage xlPackage = new OfficeOpenXml.ExcelPackage(new FileInfo(filePath)))
            {
                var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select the first sheet here
                var totalRows = myWorksheet.Dimension.End.Row;
                var totalColumns = myWorksheet.Dimension.End.Column;

                var columns = new StringBuilder(); //this is your columns

                var columnRows = myWorksheet.Cells[1, 1, 1, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());

                columns.Append("INSERT INTO["+ tableName +"] (");
                foreach (var colrow in columnRows)
                {
                    columns.Append("[");
                    columns.Append(colrow);
                    columns.Append("]");
                    columns.Append(",");
                }
                columns.Length--;
                columns.Append(") VALUES (");
                for (int rowNum = 2; rowNum <= totalRows; rowNum++) //selet starting row here
                {
                    var dataRows = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());

                    var finalQuery = new StringBuilder(); 
                    finalQuery.Append(columns);

                    foreach (var dataRow in dataRows)
                    {
                        finalQuery.Append("'");
                        finalQuery.Append(dataRow);
                        finalQuery.Append("'");
                        finalQuery.Append(",");
                    }
                    finalQuery.Length--;

                    finalQuery.Append(");");

                    outputQuery.Append(finalQuery);

                  }

            }
        }

return outputQuery.ToString();}

1
这里有另一个非常有效的工具...

http://www.convertcsv.com/csv-to-sql.htm

它可以接受制表符分隔的值并生成插入脚本。只需复制并粘贴,在选项的步骤2下,勾选“第一行是列名”复选框

然后向下滚动,在步骤3下,在“模式.表或视图名称:”框中输入您的表名

还要注意删除和创建表复选框,并确保在运行之前检查生成的脚本。

这是我找到的最快最可靠的方法。


0
这是一个链接,指向一个在线自动化工具,可以将 CSV 文件转换为 SQL Insert Into 语句:

CSV-to-SQL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接