我正在寻求帮助,使用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]或一些自定义表名,以防导出数据时会出错,或者如果您不确定数据,并希望在移动到所需的确切表之前进一步分析它。
现在通过点击下一步/完成按钮直接到向导的末尾。
基于SQL Server的CSV导入
1) CSV文件数据之间可能有,(逗号)(例如:
描述),那么我如何才能使导入处理这些数据?
解决方案
如果使用,(逗号)作为分隔符,则无法区分作为字段结束符的逗号和数据中的逗号。我会使用不同的FIELDTERMINATOR,如||。代码看起来就像。这将完美地处理逗号和单斜杠。
2)如果客户端从excel中创建了csv,那么有数据
逗号被括在"…(双引号)[如下所示
那么导入如何处理这个问题呢?
解决方案
如果你使用BULK插入,那么没有办法处理双引号,数据将
用双引号插入行。
在将数据插入表后,您可以将这些双引号替换为"。
update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
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
)
我知道这不是上述问题的确切解决方案,但对我来说,当我试图将数据从位于单独服务器上的一个数据库复制到我的本地时,这是一场噩梦。
我试图通过首先从服务器导出数据到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]或一些自定义表名,以防导出数据时会出错,或者如果您不确定数据,并希望在移动到所需的确切表之前进一步分析它。
现在通过点击下一步/完成按钮直接到向导的末尾。