将CSV文件导入SQL Server

Pra*_*hat 170 sql sql-server csv bulkinsert bulk

我正在寻找帮助将.csv文件导入SQL Server使用BULK INSERT,我几乎没有基本问题.

问题:

  1. CSV文件数据之间可能有,(逗号)(例如:描述),那么如何进行导入处理这些数据呢?

  2. 如果客户端从Excel创建CSV,那么带有逗号的数据将包含在""(双引号)[如下例]中,那么导入如何处理呢?

  3. 我们如何跟踪某些行是否包含导致跳过的错误数据?(导入是否会跳过不可导入的行)

以下是带标题的示例CSV:

Name,Class,Subject,ExamDate,Mark,Description
Prabhat,4,Math,2/10/2013,25,Test data for prabhat.
Murari,5,Science,2/11/2013,24,"Test data for his's test, where we can test 2nd ROW, Test."
sanjay,4,Science,,25,Test Only.
Run Code Online (Sandbox Code Playgroud)

和要导入的SQL语句:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)
Run Code Online (Sandbox Code Playgroud)

mr_*_*air 156

基于SQL Server CSV导入

1)CSV文件数据之间可能有,(逗号)(例如:描述),那么如何导入处理这些数据呢?

如果您使用,(逗号)作为分隔符,则无法区分逗号作为字段终止符和数据中的逗号.我会用不同的FIELDTERMINATOR||.代码看起来像,这将完美地处理逗号和单斜杠.

2)如果客户端从excel创建csv,那么带有逗号的数据被包含在" ... "(双引号)[如下例]中,那么导入如何处理呢?

如果您正在使用BULK insert,则无法处理双引号,数据将以双引号插入行.将数据插入表后,您可以用' ' 替换那些双引号.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
Run Code Online (Sandbox Code Playgroud)

3)我们如何跟踪某些行是否有错误数据导入跳过?(导入是否会跳过不可导入的行)?

要处理因数据或格式无效而未加载到表中的行,可以使用ERRORFILE属性进行处理,指定错误文件名,将错误行写入错误文件.代码应该是这样的.

BULK INSERT SchoolsTemp
    FROM 'C:\CSVData\Schools.csv'
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    ERRORFILE = 'C:\CSVDATA\SchoolsErrorRows.csv',
    TABLOCK
    )
Run Code Online (Sandbox Code Playgroud)

  • 该文件必须位于**服务器上**。不在您的本地计算机上。 (3认同)
  • @Jess,只要正确配置权限,指定的文件可以是 UNC 路径(例如,\\machinename\public\):https://dba.stackexchange.com/questions/44524/bulk-insert-through-network (2认同)

小智 26

首先需要在数据库中创建一个表,在该表中将导入CSV文件.创建表后,请按照以下步骤操作.

•使用SQL Server Management Studio登录数据库

•右键单击数据库并选择 Tasks -> Import Data...

•单击Next >按钮

•对于数据源,请选择Flat File Source.然后使用"浏览"按钮选择CSV文件.花点时间配置在单击Next >按钮之前导入数据的方式.

•对于Destination,选择正确的数据库提供程序(例如,对于SQL Server 2012,可以使用SQL Server Native Client 11.0).输入服务器名称.检查Use SQL Server Authentication单选按钮.在单击Next >按钮之前输入用户名,密码和数据库.

•在"选择源表和视图"窗口中,可以在单击Next >按钮之前编辑映射.

•选中Run immediately复选框并单击Next >按钮.

•单击Finish按钮以运行包.

以上是在这个网站找到的(我已经使用过并经过测试):

  • 如果您将归因于[您从...复制/粘贴此答案的页面],那将是很好的.(https://support.discountasp.net/kb/a1179/how-to-import-a-csv-file -INTO-A使用的数据库 - -SQL服务器的管理,studio.aspx) (24认同)
  • 我喜欢你只是从网页上剪切和粘贴,非常有用的一行 _“花一些时间配置你希望如何导入数据”_。这就是我正在寻找的_一切_:我似乎根本无法配置它! (2认同)

小智 20

2)如果客户端从excel创建csv,那么带有逗号的数据被包含在"..."(双引号)中[如下例]那么导入如何处理这个?

你应该使用FORMAT ='CSV',FIELDQUOTE ='''选项:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FORMAT = 'CSV', 
    FIELDQUOTE = '"',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)
Run Code Online (Sandbox Code Playgroud)

  • 请注意, FORMAT 说明符仅自 SQL Server 2017 起可用。 (4认同)

Sac*_*nth 11

解决数据问题中逗号的最佳,最快速和最简单的方法是在将Windows的列表分隔符设置设置为逗号以外的其他内容(例如管道)之后使用Excel保存逗号分隔文件.然后,这将为您生成一个管道(或其他)分隔文件,然后您可以导入该文件.这在这里描述.


小智 7

由于他们不使用 SQL 导入向导,因此步骤如下:

在此输入图像描述

  1. 右键单击选项任务中的数据库导入数据,

  2. 一旦成为巫师打开后,我们选择要隐含的数据类型。在这种情况下,它将是

平面文件源

我们选择CSV文件,可以在CSV中配置表格的数据类型,但最好是从CSV中带出来。

  1. 单击下一步并选择最后一个选项

SQL客户端

根据我们选择的身份验证类型,一旦完成,就会出现一个非常重要的选项。

  1. 我们可以在CSV中定义表的id(建议CSV的列应与表中的字段命名相同)。在“编辑映射”选项中,我们可以看到每个表与电子表格列的预览,如果我们希望向导默认插入 ID,则不要选中该选项。

启用 ID 插入

(通常不是从 1 开始),如果我们在 CSV 中有一个包含 id 的列,我们选择启用 id 插入,下一步是结束向导,我们可以在此处查看更改。

另一方面,在下面的窗口中可能会出现警报或警告,理想的情况是忽略它,只有当它们留下错误时时才需要注意。

这个链接有图片


kom*_*bsh 5

首先需要将 CSV 文件导入数据表

然后您可以使用 SQLBulkCopy 插入批量行

using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlBulkInsertExample
{
    class Program
    {
      static void Main(string[] args)
        {
            DataTable prodSalesData = new DataTable("ProductSalesData");

            // Create Column 1: SaleDate
            DataColumn dateColumn = new DataColumn();
            dateColumn.DataType = Type.GetType("System.DateTime");
            dateColumn.ColumnName = "SaleDate";

            // Create Column 2: ProductName
            DataColumn productNameColumn = new DataColumn();
            productNameColumn.ColumnName = "ProductName";

            // Create Column 3: TotalSales
            DataColumn totalSalesColumn = new DataColumn();
            totalSalesColumn.DataType = Type.GetType("System.Int32");
            totalSalesColumn.ColumnName = "TotalSales";

            // Add the columns to the ProductSalesData DataTable
            prodSalesData.Columns.Add(dateColumn);
            prodSalesData.Columns.Add(productNameColumn);
            prodSalesData.Columns.Add(totalSalesColumn);

            // Let's populate the datatable with our stats.
            // You can add as many rows as you want here!

            // Create a new row
            DataRow dailyProductSalesRow = prodSalesData.NewRow();
            dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
            dailyProductSalesRow["ProductName"] = "Nike";
            dailyProductSalesRow["TotalSales"] = 10;

            // Add the row to the ProductSalesData DataTable
            prodSalesData.Rows.Add(dailyProductSalesRow);

            // Copy the DataTable to SQL Server using SqlBulkCopy
            using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = prodSalesData.TableName;

                    foreach (var column in prodSalesData.Columns)
                        s.ColumnMappings.Add(column.ToString(), column.ToString());

                    s.WriteToServer(prodSalesData);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)