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


Answers:


202

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

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

在MS SQL中,您可以使用:

SET NOCOUNT ON

放弃显示所有“第1行受影响”的注释。而且,如果您要执行很多行并且出错了,请偶尔在语句之间放置一个GO


3
我正在使用,=CONCATENATE()但使用该&标志可提高可读性!
mastazi

1
@mastazi同意!我切换到前一段时间&遇到参数限制CONCATENATE()时,由于限制为255个参数,这已经不是一个普遍的问题,但是我从来没有考虑过还原。
哈特CO

1
CONCATENATE()是必经之路。只需单击编辑栏上的fx图标即可查看输入的内容。它比使用和签名要干净得多。当然,使用&符号很酷,但是有时当您使用双引号或单引号时,它将使您永远可以算出丢失的内容。
ian0411 '16

1
单元格中带有引号时不起作用。检查我的答案是否有更正的版本。
西蒙·巴尔

2
@PreshanPradeepa您可以使用相同的语法,只要整数是有效整数,SQL Server便不会在乎是否使用引号。
哈特CO

29

有一个方便的工具,可以节省很多时间

http://tools.perceptus.ca/text-wiz.php?ops=7

您只需要输入表名,字段名和数据-分隔的选项卡,然后单击Go!


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

28

您可以通过Management Studio界面创建适当的表,然后将数据插入表中,如下所示。根据数据量可能会花费一些时间,但是非常方便。

在此处输入图片说明

在此处输入图片说明


便利。我看到带有IDENTITY列的副本缓冲区需要具有该列,即使其中的数据会随着插入行时自动生成的值而被忽略。
fortboise 2015年

您可以将IDENTITY列作为列列表中的最后一个列,然后完全不需要额外的列。
Andrey Morozov 2015年

1
如果您未在Excel工作表中指定IDENTITY值;您可以通过删除IDENTITY列来更改并重新运行编辑前200行sql脚本。因此,当您复制并粘贴没有IDENTITY的值时,此方法将起作用。
aozan88

对于遇到问题的其他任何人,Excel中的日期和时间字段都将其破坏。由于某种原因,日期时间数据在SQL端被转换为“二进制”数据。
凯文·瓦斯科

1
@condiosluzverde我建议您发布自己的答案。如果编辑此答案,您的更改可能会被社区版主拒绝。
安德烈·莫罗佐夫

16

您可以使用以下excel语句:

="INSERT INTO table_name(`"&$A$1&"`,`"&$B$1&"`,`"&$C$1&"`, `"&$D$1&"`) VALUES('"&SUBSTITUTE(A2, "'", "\'")&"','"&SUBSTITUTE(B2, "'", "\'")&"','"&SUBSTITUTE(C2, "'", "\'")&"', "&D2&");"

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


1
辛苦了 在GoogleSheets中,我必须删除列名引用周围的`(重音/反引号)。
secretwep

5

根据数据库,您可以导出为CSV,然后使用导入方法。

MySQL- http://dev.mysql.com/doc/refman/5.1/en/load-data.html

PostgreSQL- http://www.postgresql.org/docs/8.2/static/sql-copy.html


3
MS SQL,您可以使用SSMS的导入向导来导入Excel文件。
哈特CO

1
要将详细信息添加到@HartCO-要导航到SSMS导入向导,请在数据库上单击鼠标右键,将鼠标悬停在任务上,然后单击上下文菜单底部附近的“导入数据...”。请按照向导中的步骤进行操作。
qxotk

2

您可以使用VB编写一些内容,然后逐行输出到文件中,并在数据周围添加适当的sql语句。我以前做过。


1

这是另一个效果很好的工具...

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

它可以采用制表符分隔的值并生成INSERT脚本。只需复制并粘贴,然后在步骤2下的选项中选中“第一行是列名”框

然后向下滚动并在步骤3下,在“ Schema.Table或View Name:”框中输入表名称。

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

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


1

使用PowerShell库中ConvertFrom-ExcelToSQLInsertImportExcel

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


0

我生成此查询是为了将Excel文件数据插入数据库。在此id和price中,数字值和日期字段也是如此。该查询总结了我需要的所有类型,这可能也对您有用

="insert into  product (product_id,name,date,price) values("&A1&",'" &B1& "','" &C1& "'," &D1& ");"


    Id    Name           Date           price 
    7   Product 7   2017-01-05 15:28:37 200
    8   Product 8   2017-01-05 15:28:37 40
    9   Product 9   2017-01-05 15:32:31 500
    10  Product 10  2017-01-05 15:32:31 30
    11  Product 11  2017-01-05 15:32:31 99
    12  Product 12  2017-01-05 15:32:31 25

0

您可以使用下面的C#方法使用Excel工作表生成插入脚本,只需要在执行该方法之前从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();}


0

我有一个可靠的方法可以可靠地生成SQL插入,并且可以在处理过程中修改部分参数。它对我的工作有很大帮助,例如,将数百个数据复制到结构和字段数不兼容的数据库中。 我使用的功能强大的工具IntellIJ DataGrip。DG可以按列或行从WPS office或MS Excel轻松接收数据。复制后,DG可以将数据导出为SQL插入

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.