我将CSV文件结构为string;string;string
第一个字符串以"“引号。其他两个字符串不是。
我使用nchar( x )将它们大容量地插入到表中,这三个列中的每个列都有足够大的x值。
BULK INSERT [table] FROM 'import.csv' WITH (FIELDTERMINATOR = ';')
这已经用了几年了。
从几天以来,导入在某些行上出现了问题。在调查之后,每个失败的行在第三列上得到一个转换/类型不匹配错误。
数据发生变化的原因是,在第三个字符串的中间,文本(DENY)现在出现在每个失败的行中。以前从来没有发生过这种情况。
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1019, column 3 (Rights).
知道为什么出现子字符串(拒绝)会导致这种情况发生吗?
(我知道它是一个SQL保留词,但为什么在这个位置上要解析它呢?)
怎么解决这个问题?我仍然需要导入这些行,包括文本。
第3栏的样本内容:
(I)(OI)(CI)(F)
(I)(OI)(CI)(DENY)(WDAC,WO,S,DC)
(I)(OI)(CI)(F)
第2行给出了错误。另外两个进口罚款。
(如果您想知道:是的,我正在解析的是ICACLS输出。)
发布于 2015-02-27 15:03:07
经过一些实验,我发现了以下几点:
DENY
这个词确实是一条红鲱鱼。这个问题是由它背后的(xx,xx,xx,xx)
序列引起的。
由于某些原因,如果大容量插入是从动态SQL字符串运行的,则会导致错误。
(我使用动态SQL,因为我需要迭代从另一个表派生的输入文件名列表。bulk insert不允许对输入文件名使用变量。因此,我必须以编程方式生成每个bulk insert语句,然后EXEC()
它。)
如果直接运行,具有相同输入文件的大容量插入可以正常工作。相同文件的BCP导入也可以。
如果包含此序列的列不是输入行的最后一列,则按预期工作。
由于我完全控制了生成这些文件的脚本,所以我可以添加一个只包含一个=
的第四个虚拟列。这解决了批量插入的问题。
很明显我还是不明白原因是什么。至少我有个解决办法。
微软在MSDN上多次声明
“不支持大规模插入CSV文件,但在某些情况下可能有效”
他们从不说为什么或者确切的问题是..。
让我怀疑我是否遇到了已知的问题..。
https://dba.stackexchange.com/questions/93784
复制相似问题