首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >T-SQL大容量插入在字符串-数据中的特定单词“拒绝”上失败。

T-SQL大容量插入在字符串-数据中的特定单词“拒绝”上失败。
EN

Database Administration用户
提问于 2015-02-25 14:47:00
回答 1查看 387关注 0票数 0

我将CSV文件结构为string;string;string

第一个字符串以"“引号。其他两个字符串不是。

我使用nchar( x )将它们大容量地插入到表中,这三个列中的每个列都有足够大的x值。

代码语言:javascript
代码运行次数:0
运行
复制
BULK INSERT [table] FROM 'import.csv' WITH (FIELDTERMINATOR = ';')

这已经用了几年了。

从几天以来,导入在某些行上出现了问题。在调查之后,每个失败的行在第三列上得到一个转换/类型不匹配错误。

数据发生变化的原因是,在第三个字符串的中间,文本(DENY)现在出现在每个失败的行中。以前从来没有发生过这种情况。

代码语言:javascript
代码运行次数:0
运行
复制
 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栏的样本内容:

代码语言:javascript
代码运行次数:0
运行
复制
(I)(OI)(CI)(F)
(I)(OI)(CI)(DENY)(WDAC,WO,S,DC)
(I)(OI)(CI)(F)

第2行给出了错误。另外两个进口罚款。

(如果您想知道:是的,我正在解析的是ICACLS输出。)

EN

回答 1

Database Administration用户

回答已采纳

发布于 2015-02-27 15:03:07

经过一些实验,我发现了以下几点:

DENY这个词确实是一条红鲱鱼。这个问题是由它背后的(xx,xx,xx,xx)序列引起的。

由于某些原因,如果大容量插入是从动态SQL字符串运行的,则会导致错误。

(我使用动态SQL,因为我需要迭代从另一个表派生的输入文件名列表。bulk insert不允许对输入文件名使用变量。因此,我必须以编程方式生成每个bulk insert语句,然后EXEC()它。)

如果直接运行,具有相同输入文件的大容量插入可以正常工作。相同文件的BCP导入也可以。

如果包含此序列的列不是输入行的最后一列,则按预期工作。

由于我完全控制了生成这些文件的脚本,所以我可以添加一个只包含一个=的第四个虚拟列。这解决了批量插入的问题。

很明显我还是不明白原因是什么。至少我有个解决办法。

微软在MSDN上多次声明

“不支持大规模插入CSV文件,但在某些情况下可能有效”

他们从不说为什么或者确切的问题是..。

让我怀疑我是否遇到了已知的问题..。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/93784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档