我正在寻求帮助,使用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]或一些自定义表名,以防导出数据时会出错,或者如果您不确定数据,并希望在移动到所需的确切表之前进一步分析它。

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

其他回答

Import the file into Excel by first opening excel, then going to DATA, import from TXT File, choose the csv extension which will preserve 0 prefixed values, and save that column as TEXT because excel will drop the leading 0 otherwise (DO NOT double click to open with Excel if you have numeric data in a field starting with a 0 [zero]). Then just save out as a Tab Delimited Text file. When you are importing into excel you get an option to save as GENERAL, TEXT, etc.. choose TEXT so that quotes in the middle of a string in a field like YourCompany,LLC are preserved also...

BULK INSERT dbo.YourTableName
FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
WITH (
FirstRow = 2, (if skipping a header row)
FIELDTERMINATOR = '\t',
ROWTERMINATOR   = '\n'
)

我希望我可以使用FORMAT和Fieldquote功能,但在我的SSMS版本中似乎不支持

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

我试图通过首先从服务器导出数据到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]或一些自定义表名,以防导出数据时会出错,或者如果您不确定数据,并希望在移动到所需的确切表之前进一步分析它。

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

也许不是你想要的,但另一种选择是为notepad++使用CSV Lint插件

该插件可以事先验证csv数据,这意味着检查坏数据,如缺少引号、不正确的十进制分隔符、日期时间格式错误等。而不是BULK INSERT,它可以将csv文件转换为SQL插入脚本。

SQL脚本将为每1000条记录的csv行包含INSERT语句,并调整任何datetime和十进制值。该插件自动检测csv中的数据类型,它将包括一个CREATE TABLE部分,其中包含每个列的正确数据类型。

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
)

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

右键单击任务选项中的数据库导入数据, 一旦向导打开,我们选择要隐含的数据类型。在这种情况下,它是

平面文件源

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

单击Next并选择最后一个选项

SQL客户机

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

我们可以在CSV中定义表的id(建议CSV中的列应该与表中的字段相同)。在Edit Mappings选项中,我们可以看到带有电子表格列的每个表的预览,如果我们希望向导在默认情况下插入id,则不勾选该选项。

启用id插入

(通常不是从1开始),相反,如果我们在CSV中有一个id列,我们选择启用id插入,下一步是结束向导,我们可以在这里检查更改。

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

这个链接有图片。