尽pipevarchar(MAX)用于每列,但在导入CSV文件时SQL Server中出现错误

我试图插入一个大的CSV文件(几个演出)到SQL Server,但一旦我通过导入向导,最后尝试导入文件,我得到以下错误报告:

  • 执行(错误)消息错误0xc02020a1:数据stream任务1:数据转换失败。 “”标题“”返回状态值4和状态文本“列的数据转换被截断或目标代码页中一个或多个字符不匹配。 (SQL Server导入和导出向导)

  • 错误0xc020902a:数据stream任务1:“源 – Train_csv.Outputs [平面文件源输出] .Columns [”标题“]”失败,因为截断发生,截断行处置“Source – Train_csv.Outputs [Flat File Source输出] .Columns [“标题”]指定截断失败。 指定组件的指定对象上发生截断错误。 (SQL Server导入和导出向导)

  • 错误0xc0202092:数据stream任务1:处理数据行2上的文件“C:\ Train.csv”时发生错误。(SQL Server导入和导出向导)

  • 错误0xc0047038:数据stream任务1:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。 Source – Train_csv上的PrimeOutput方法返回了错误代码0xC0202092。 pipe道引擎调用PrimeOutput()时,组件返回失败代码。 失败代码的含义由组件定义,但错误是致命的,并且pipe道停止执行。 在此之前可能会发布错误消息,提供有关失败的更多信息。 (SQL Server导入和导出向导)

我创build了表格来将文件插入到第一个列表中,并将每列设置为保存varchar(MAX),所以我不明白我是如何仍然有这个截断问题。 我究竟做错了什么?

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

数据types与MS SQL中的数据types不同,而不是VARCHAR(255)它是DT_STR ,输出列的宽度可以设置为255 。 对于VARCHAR(MAX)它是DT_TEXT

因此,在“数据源”select的“ Advanced选项卡上,将任何违规列的数据types从DT_STRDT_TEXT (您可以select多个列并一次全部更改)。

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

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

为了解决这个问题,在平面文件提供者的“select数据源”中,select文件后,在input列表下面出现“build议types..”button。 点击这个button之后,即使没有对该对话框进行更改,平面文件提供程序也会重新查询源.csv文件,然后正确确定源文件中字段的长度。

一旦完成,导入过程没有进一步的问题。

我认为它是一个错误,请应用解决方法,然后再试一次: http : //support.microsoft.com/kb/281517 。

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

高级编辑器没有解决我的问题,而是我被迫通过记事本(或您最喜爱的文本/ XML编辑器)编辑dtsx文件,并手动replace属性值

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

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

运行SQL Server 2008 R2

转到高级选项卡—->数据types的列—>这里改变数据types从DT_STR到DT_TEXT和列宽度255.现在你可以检查它将工作完美。

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

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