我有结构为字符串的 CSV 文件;字符串;string
第一个字符串用“”引起来。其他 2 个字符串不是。
我使用 nchar(x) 为 3 列中的每一列批量将它们插入到表中,x 的值足够大。
BULK INSERT [table] FROM 'import.csv' WITH (FIELDTERMINATOR = ';')
这已经工作了几年。
几天以来,导入在某些行上出现了问题。经过调查,每个失败的行都会在第 3 列出现转换/类型不匹配错误。
数据发生变化的是,在第 3 个字符串的中间,文本(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).
任何想法为什么子字符串 (DENY) 的存在会导致这种情况发生?
(我知道这是一个 SQL 保留字,但为什么要在这个位置解析它?)
如何解决它?我仍然需要导入这些行,包括该文本。
第 3 列的示例内容:
(I)(OI)(CI)(F)
(I)(OI)(CI)(DENY)(WDAC,WO,S,DC)
(I)(OI)(CI)(F)
第二行给出了错误。其他 2 个进口罚款。
(如果您想知道:是的,我正在解析的是 ICACLS 输出。)
经过一些实验,我发现了以下内容:
这个词
DENY
确实是转移注意力。问题是由(xx,xx,xx,xx)
它背后的顺序引起的。如果从动态 SQL 字符串运行批量插入,由于某些不明确的原因,这会导致错误。
(我使用的是动态 SQL,因为我需要遍历从另一个表派生的输入文件名列表。批量插入不允许对输入文件名使用变量。所以我必须以编程方式生成每个批量插入语句,然后
EXEC()
它。)如果直接运行,具有相同输入文件的批量插入工作正常。同一文件的 BCP 导入也可以。
如果包含此序列的列不是输入行的最后一列,它将按预期工作。
因为我可以完全控制生成这些文件的脚本,所以我可以添加一个仅包含
=
. 这解决了批量插入的问题。显然我仍然不明白这个的根本原因。至少我有一个解决方法。
Microsoft 在 MSDN 上多次声明
他们从不说为什么或确切的问题是什么......
让我想知道我是否遇到了一个已知问题......