我正在寻求帮助,使用BULK INSERT将.csv文件导入SQL Server,我有一些基本的问题。

问题:

CSV文件的数据可能有,(逗号)之间(Ex: description),那么我如何使导入处理这些数据? 如果客户端从Excel中创建CSV,那么有逗号的数据被括在“”(双引号)[如下例],那么导入如何处理这一点? 我们如何跟踪某些行是否有坏数据,哪些导入被跳过?(导入会跳过不可导入的行)

下面是带标题的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.

和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
)

当前回答

我知道这不是上述问题的确切解决方案,但对我来说,当我试图将数据从位于单独服务器上的一个数据库复制到我的本地时,这是一场噩梦。

我试图通过首先从服务器导出数据到CSV/txt,然后将其导入到我的本地表来做到这一点。

两种解决方案:写下查询以导入CSV或使用SSMS导入数据向导总是会产生错误(错误非常普遍,说明存在解析问题)。虽然我没有做任何特别的事情,只是导出到CSV,然后试图将CSV导入到本地DB,错误总是存在。

我试着查看映射部分和数据预览,但总是一团乱。我知道主要的问题是来自一个表列,其中包含JSON和SQL解析器处理错误。

所以最终,我想到了一个不同的解决方案,并想要分享它,以防其他人有类似的问题。


我所做的是在外部服务器上使用了导出向导。

下面是重复相同过程的步骤: 1)右键单击数据库,选择Tasks -> Export Data…

2)当向导打开时,选择“下一步”,在“数据源”的位置选择“SQL Server Native Client”。

在外部服务器的情况下,您很可能必须选择“使用SQL Server身份验证”的“身份验证模式:”。

3)点击下一步后,你必须选择目的地。 为此,再次选择“SQL Server Native Client”。 这一次,您可以提供本地(或其他外部DB) DB。

4)点击Next按钮后,你有两个选择,要么将整个表从一个DB复制到另一个DB,要么写下查询来指定要复制的确切数据。 在我的例子中,我不需要整个表(它太大了),而只是其中的一部分,所以我选择了“写一个查询来指定要传输的数据”。

我建议在使用Wizard之前,在一个单独的查询编辑器上写下并测试该查询。

5)最后,您需要指定将在其中选择数据的目标表。

我建议保留为[dbo]。[Query]或一些自定义表名,以防导出数据时会出错,或者如果您不确定数据,并希望在移动到所需的确切表之前进一步分析它。

现在通过点击下一步/完成按钮直接到向导的末尾。

其他回答

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

从2013-11-05如何使用SQL Server Management Studio将CSV文件导入到数据库中:

First create a table in your database into which you will be importing the CSV file. After the table is created: Log into your database using SQL Server Management Studio Right click on your database and select Tasks -> Import Data... Click the Next > button For the Data Source, select Flat File Source. Then use the Browse button to select the CSV file. Spend some time configuring how you want the data to be imported before clicking on the Next > button. For the Destination, select the correct database provider (e.g. for SQL Server 2012, you can use SQL Server Native Client 11.0). Enter the Server name; Check Use SQL Server Authentication, enter the User name, Password, and Database before clicking on the Next > button. On the Select Source Tables and Views window, you can Edit Mappings before clicking on the Next > button. Check the Run immediately check box and click on the Next > button. Click on the Finish button to run the package.

首先,您需要导入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);
                }
            }
        }
    }
}

我知道这不是上述问题的确切解决方案,但对我来说,当我试图将数据从位于单独服务器上的一个数据库复制到我的本地时,这是一场噩梦。

我试图通过首先从服务器导出数据到CSV/txt,然后将其导入到我的本地表来做到这一点。

两种解决方案:写下查询以导入CSV或使用SSMS导入数据向导总是会产生错误(错误非常普遍,说明存在解析问题)。虽然我没有做任何特别的事情,只是导出到CSV,然后试图将CSV导入到本地DB,错误总是存在。

我试着查看映射部分和数据预览,但总是一团乱。我知道主要的问题是来自一个表列,其中包含JSON和SQL解析器处理错误。

所以最终,我想到了一个不同的解决方案,并想要分享它,以防其他人有类似的问题。


我所做的是在外部服务器上使用了导出向导。

下面是重复相同过程的步骤: 1)右键单击数据库,选择Tasks -> Export Data…

2)当向导打开时,选择“下一步”,在“数据源”的位置选择“SQL Server Native Client”。

在外部服务器的情况下,您很可能必须选择“使用SQL Server身份验证”的“身份验证模式:”。

3)点击下一步后,你必须选择目的地。 为此,再次选择“SQL Server Native Client”。 这一次,您可以提供本地(或其他外部DB) DB。

4)点击Next按钮后,你有两个选择,要么将整个表从一个DB复制到另一个DB,要么写下查询来指定要复制的确切数据。 在我的例子中,我不需要整个表(它太大了),而只是其中的一部分,所以我选择了“写一个查询来指定要传输的数据”。

我建议在使用Wizard之前,在一个单独的查询编辑器上写下并测试该查询。

5)最后,您需要指定将在其中选择数据的目标表。

我建议保留为[dbo]。[Query]或一些自定义表名,以防导出数据时会出错,或者如果您不确定数据,并希望在移动到所需的确切表之前进一步分析它。

现在通过点击下一步/完成按钮直接到向导的末尾。

如上所述,您需要添加FORMAT和FIELDQUOTE选项来批量将. csv数据插入SQL Server。对于你的case, SQL语句是这样的:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FORMAT = 'CSV', 
    FIELDQUOTE = '""',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    TABLOCK
)

虽然SSMS中的BULK INSERT非常适合一次性导入作业,但根据您的用例,您可能需要SSMS内部或使用第三方的其他选项。下面是一个详细的指南,描述了将CSV文件导入SQL Server的各种选项,包括自动化(我的意思是计划)过程和为CSV位置指定FTP或文件存储的方法。