【发布时间】:2015-02-04 02:06:24
【问题描述】:
所以一段时间以来,我一直在努力解决 BULK INSERT 的一个令人困惑的问题。这些文件来自Linux机器,当我在十六进制编辑模式/记事本++中查看它们时,它们似乎只有一个换行符(0A)作为行终止符。我将批量插入语句存储在一个表中,稍后作业会从中选择并执行表中的语句以将数据加载到临时表中。
让我感到困惑的特殊情况是一个有 7 列的表。数据文件只有前 4 列,其余应为 NULL。
通常它们看起来像这样:
BULK INSERT STAGING_TABLE FROM 'FILE_LOCATION'
WITH (
DATAFILETYPE = 'widechar'
, FIELDTERMINATOR = ','
, ROWTERMINATOR = 'something_here'
);
行终止符是我问题的最大根源。
当我尝试使用“\n”时,批量插入因截断错误而失败——它似乎将文件视为一个长字符串,并且仅正确分隔列,直到它用完列(因此出现截断错误)。
当我使用“0x0a”时,批量插入因“意外的文件结尾”错误而失败。文件末尾有一个空行,但即使我删除它仍然会抛出相同的错误,所以我不确定那里有什么问题。
到目前为止,唯一一个可以将数据实际放入表中的方法是“\l”。有谁知道那是什么意思?我进行了广泛的搜索,但似乎没有关于它的文档。那或者我一直在寻找错误的地方。
将 \l 作为行终止符的奇怪之处在于,即使它成功加载,它仍然不尊重行终止符...行只是被加载到所有 7 列中,并以看似随机的间隔拆分。
有人知道吗?我应该再澄清一些吗?
【问题讨论】:
标签: sql sql-server-2008-r2 bulkinsert