尽管每列都使用varchar(MAX),但导入CSV文件时SQL Server中出现错误


70

我正在尝试将CS​​V文件(几个演出)插入其中SQL Server,但是一旦我通过Import Wizard并最终尝试导入该文件,就会收到以下错误报告:

  • 执行(错误)消息

错误0xc02020a1:数据流任务1:数据转换失败。“列标题”列的数据转换返回状态值4和状态文本“文本已被截断或目标代码页中的一个或多个字符不匹配”。

SQL Server Import and Export Wizard

错误0xc020902a:数据流任务1:“源-Train_csv.Outputs [平面文件源输出] .Columns [“标题”]“由于发生截断而失败,并且截断行位于“源-Train_csv.Outputs [平面文件源”上输出] .Columns [“标题”]“指定截断失败。在指定组件的指定对象上发生了截断错误。

SQL Server Import and Export Wizard

错误0xc0202092:数据流任务1:处理数据行2上的文件“ C:\ Train.csv”时发生错误。

SQL Server Import and Export Wizard

错误0xc0047038:数据流任务1:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。Source-Train_csv上的PrimeOutput方法返回错误代码0xC0202092。当管道引擎调用PrimeOutput()时,该组件返回失败代码。故障代码的含义由组件定义,但错误是致命的,并且管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

SQL Server Import and Export Wizard

我创建了将文件插入到其中的表,然后将每一列都设置为容纳varchar(MAX),所以我不明白如何仍然会遇到这种截断问题。我究竟做错了什么?


看一下第二行数据。两个可能的原因是空白字段和​​/或字段中的逗号。
Dan Bracuk 2013年

我检查了第二行,每列中的字段看起来都很好。没有空,没有NULL,没有逗号。
GMS 2013年

Answers:


180

在SQL Server导入和导出向导中,您可以在Advanced选项卡中调整源数据类型(如果创建新表,则它们将成为输出的数据类型,否则仅用于处理源数据)。

的数据类型是比在MS SQL烦人不同,而不是VARCHAR(255)它的DT_STR与输出列的宽度可以被设置为255。因为VARCHAR(MAX)DT_TEXT

因此,在“数据源”Advanced选项卡上的选项卡上,将任何有问题的列的数据类型从DT_STR更改为DT_TEXT(您可以选择多个列并一次将其全部更改)。

导入和导出向导-数据源-高级


1
在我最大化列长度之后,这似乎起到了作用!非常感谢
GMS 2013年

2
我不得不将列更改为DT_DATEDT_NUMERIC等等。这是我一段时间以来最繁琐又烦人的事情。但是,这比使用所有varchar(50)列创建新表要好。那真的没有帮助。
杰西2015年

1
即使对于SQL Server,一旦数据长度不超过55个字符,这也对我有用。奇怪...
John Pasquet 2015年

1
我找到了!我在窗口顶部寻找“标签”
Casey Crookston,2017年

2
奇怪的是,如果我使用Suggest Types...它并扫描了所有6000行,它会更改所有列的长度值,大概是遇到的最高值,但错误仍然存​​在。对我来说,唯一的解决方法是将它们全部更改为DT_TEXT。一次找到一个冒犯性的列需要花很多时间。
Sinjai

1

这个答案可能并不普遍适用,但是它解决了导入小文本文件时遇到的此错误。平面文件提供程序基于源中固定的50个字符的文本列进行导入,这是不正确的。重新映射目标列的数量不会影响此问题。

要解决此问题,请在选择文件后在平面文件提供程序的“选择数据源”中,在输入列列表下方显示“建议类型..”按钮。单击此按钮后,即使未更改正在使用的对话框,平面文件提供程序也会重新查询源.csv文件,然后正确确定源文件中字段的长度。

完成此操作后,导入便不会再有其他问题了。


0

我认为这是一个错误,请应用变通办法,然后重试:http : //support.microsoft.com/kb/281517

另外,进入“高级”选项卡,并确认“目标”列的长度是否为Varchar(max)。


它们肯定是varchar(MAX)。我还进入了高级,使每列宽度为8000个字符。现在,我仅在最后一列中收到此错误。
GMS

0

高级编辑器无法解决我的问题,相反,我被迫通过记事本(或您喜欢的text / xml编辑器)编辑dtsx文件,并手动将属性值替换为

length="0" dataType="nText" (我正在使用unicode)

在以text / xml模式进行编辑之前,请始终备份dtsx文件。

运行SQL Server 2008 R2


0

转到“高级”选项卡---->列的数据类型--->在此将数据类型从DT_STR更改为DT_TEXT,列宽为255。现在您可以检查它是否可以正常使用。


什么“高级”标签?我没有看到任何这样的标签
卡西克鲁克斯顿

@Hart CO应该显示Connection向导的图像,该图像具有我认为Lokesh在谈论的高级选项卡
Sam

0

问题:Jet OLE DB提供程序读取注册表项,以确定要读取多少行才能猜测源列的类型。默认情况下,此键的值为8。因此,提供程序将扫描源数据的前8行,以确定列的数据类型。如果任何字段看起来像文本,并且数据长度超过255个字符,则该列将被键入为备注字段。因此,如果在源的前8行中没有长度大于255个字符的数据,Jet将无法准确确定数据类型的性质。由于导出工作表中数据的前8行长度小于255,因此将源长度视为VARCHAR(255),并且无法从具有更大长度的列中读取数据。

修复:解决方案只是按降序对注释列进行排序。从2012年起,我们可以在“导入”向导的“高级”选项卡中更新值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.