Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server大容量插入包含逗号数据的csv_Sql_Sql Server_Csv_Bulkinsert - Fatal编程技术网

sql server大容量插入包含逗号数据的csv

sql server大容量插入包含逗号数据的csv,sql,sql-server,csv,bulkinsert,Sql,Sql Server,Csv,Bulkinsert,下面是csv的示例行 012,12/11/2013,"<555523051548>KRISHNA KUMAR ASHOKU,AR",<10-12-2013>,555523051548,12/11/2013,"13,012.55", 有什么解决方案吗?不幸的是,SQL Server导入方法(BCP和大容量插入)不理解引用“” 来源:答案是:你不能那样做。看 “从CSV文件导入数据 SQL Server批量导入操作不支持逗号分隔值(CSV)文件。但是,在某些情况下,CS

下面是csv的示例行

012,12/11/2013,"<555523051548>KRISHNA  KUMAR  ASHOKU,AR",<10-12-2013>,555523051548,12/11/2013,"13,012.55",

有什么解决方案吗?

不幸的是,SQL Server导入方法(BCP和大容量插入)不理解引用“”


来源:

答案是:你不能那样做。看

“从CSV文件导入数据

SQL Server批量导入操作不支持逗号分隔值(CSV)文件。但是,在某些情况下,CSV文件可以用作将数据批量导入SQL Server的数据文件。有关从CSV数据文件导入数据的要求的信息,请参阅为批量导出或导入准备数据(SQL Server)。”


一般的解决方案是,您必须将CSV文件转换为可以成功导入的文件。您可以通过多种方式实现这一点,例如使用不同的分隔符(如TAB)创建文件,或者使用理解CSV文件(如Excel或多种脚本语言)的工具导入表,然后使用唯一的分隔符(如TAB)导出表,您可以从中大容量插入。

我最近遇到了这个问题,必须切换到制表符分隔格式。如果您这样做,并使用SQLServerManagementStudio进行导入(右键单击数据库,然后选择Tasks,然后选择import)选项卡delimited工作正常。带制表符分隔符的大容量插入选项也应起作用


我必须承认,当发现MicrosoftSQLServer有这个逗号分隔的问题时,我感到非常惊讶。CSV文件格式非常旧,因此发现这是现代数据库的一个问题非常令人失望。

批量插入非常快,但不是很灵活。能否将数据加载到临时表中,然后将所有内容推送到生产表中?一旦进入SQL Server,您将可以更好地控制如何将数据从一个表移动到另一个表。所以,基本上

1)    Load data into staging
2)    Clean/Convert by copying to a second staging table defined using the desired datatypes. Good data copied over, bad data left behind
3)    Copy data from the "clean" table to the "live" table

MS现在已经解决了这个问题,您可以在with子句中使用FIELDQUOTE添加带引号的字符串支持:

FIELDQUOTE = '"',

如果您有SQL Server 2017或更高版本,则with子句中的任何位置都可以做到这一点。

他们添加了对SQL Server 2017(14.x)CTP 1.1的支持。大容量插入命令需要使用FORMAT='CSV'输入文件选项

要清楚的是,csv看起来给我带来了问题,第一行很容易解析,第二行包含曲线球,因为引用字段中有一个逗号:

jenkins-2019-09-25_cve-2019-10401,cve-2019-10401,4,jenkins咨询2019-09-25:cve-2019-10401:
jenkins-2019-09-25_cve-2019-10403_cve-2019-10404,“cve-2019-10404,cve-2019-10403”,4,jenkins咨询2019-09-25:cve-2019-10403:cve-2019-10404:
破译的代码

BULK INSERT temp
    FROM 'c:\test.csv'
    WITH
    (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '0x0a',
        FIRSTROW= 2
    );
工作代码

BULK INSERT temp
    FROM 'c:\test.csv'
    WITH
    (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '0x0a',
        FORMAT = 'CSV',
        FIRSTROW= 2
    );

将其导入临时表并修复。请提供替代解决方案或删除您的答案并留下评论。我认为给出的答案是正确的。无法修改SQL命令以获得所需的结果。CSV文件在上载之前必须经过预处理。选择修改文件的特定工具或技术超出了问题的范围。我对答案稍加修改以使其更清楚。你是说投票率最高的答案?没有一个答案被接受。
BULK INSERT temp
    FROM 'c:\test.csv'
    WITH
    (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '0x0a',
        FORMAT = 'CSV',
        FIRSTROW= 2
    );