使用导入导出向导将数据从 Excel 导入 Sql Server 时,如何更改列的默认 varchar 255?

Posted

技术标签:

【中文标题】使用导入导出向导将数据从 Excel 导入 Sql Server 时,如何更改列的默认 varchar 255?【英文标题】:How does one change the default varchar 255 of a column when importing data from Excel to Sql Server using Import Export Wizard? 【发布时间】:2011-09-15 15:24:04 【问题描述】:

我正在尝试使用导入向导将数据从 excel 导入 Sql Server。第一步似乎一切都很好。该向导能够读取 excel 文件并正确识别列。但是在进程实际运行的最后一步中,它失败并给出以下错误:

错误 0xc020901c:数据流任务 1:输出出错 输出“Excel 源输出”(9) 上的“AlternateName”(24) 列。这 返回的列状态为:“文本被截断或一个或多个 目标代码页中的字符不匹配。”。(SQL Server 导入 和导出向导)

错误 0xc020902a:数据流任务 1:“输出列“AlternateName” (24)" 由于发生截断而失败,并且截断行 “输出列“AlternateName”(24)”上的处置指定失败 关于截断。的指定对象发生截断错误 指定的组件。 (SQL Server 导入导出向导)

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

AlternateName 列的最大数据长度为 658 个字符。目标表的 AlternateName 列定义为 varchar(1000)。所以我不确定为什么会出现这个错误。但后来我注意到了这一点

我有一种预感,这可能是导致问题的原因。但是,如何更改定义为 varchar 255 的 Source 列?

【问题讨论】:

【参考方案1】:

您可能需要在向导中编写自己的查询并将列转换为 varchar(1000) - 我不能 100% 确定这会起作用。或者,纸张有多大?该向导仅“向下查看”这么多行(默认情况下为 IIRC 10000,它是注册表设置)以确定数据类型和宽度。重新排序 excel 文件,使最长的 AlternateName 值位于顶部。

【讨论】:

谢谢!该表有超过 20,000 行。我将 AlternateName 的第一个值设置为非常长并且有效! 根据here的答案之一,它只查看前8行。 它只查看很少的行,绝对不是 10000 行。我有一张少于 100 行的工作表无法正确导入。有趣的是,平面文件源(而不是 Excel)选项确实有一个对话框 Advanced > Suggest Types > Number of rows,您可以在那里输入任意数量的行。奇怪的是,导入 Excel 时缺少这个。 (顺便说一句,您也不能只将 Excel 工作表转换为平面文件 - 我发现导入向导在解析生成的 CSV 时也有不同的问题)。【参考方案2】:

我遇到了同样的问题,我发现一种解决方法是根据从最大到最小的单元格长度对较大的行进行排序,并在 Excel 文档中导致问题,因为导入导出向导只检查前 200 行。

使用行后,导入导出向导检测到更大的长度并将源列数据类型更改为 LongText。

【讨论】:

非常好。为我工作。我将最大值保留在顶部,并且列更改了它的数据类型。好把戏:)【参考方案3】:

我在将 excel 文件(版本 97-2003)导入 2016 SQL Server 时遇到了同样的问题。我的 Excel 文件有 10 列,但其中 2 列包含最多 600 个字符的大字符数据(“描述”、“输出”)。当我根据名为“描述”的列对 excel 进行排序时,出现上述截断错误再次显示在其行中也包含大量数据的另一列(称为“输出”)。即使我尝试根据“输出”列从最大行到最小行排序,同样的错误也会显示给“描述”列。另外,当我将该excel导入2008 SQL server时,执行后没有任何错误。错误只是当我想将该文件导入 SQL Server 2016 时。如果有人解决我的问题以便将该 Excel 文件导入 2016 SQL Server,我将不胜感激。

【讨论】:

【参考方案4】:

SQLServer 默认只检查前 8 行的 excel 数据并估计列类型和宽度。因此,您可以将默认设置更改为前 n 行,甚至可以像这样删除限制:

使用 regedit 命令打开 Windows 注册表。

在 Windows 注册表中转到此路径:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Excel

查找具有此标题的密钥:

TypeGuessRows

双击它并将值更改为您想要的值。请注意,value=0 将强制 SQLServer 检查整个 excel 工作表。

【讨论】:

以上是关于使用导入导出向导将数据从 Excel 导入 Sql Server 时,如何更改列的默认 varchar 255?的主要内容,如果未能解决你的问题,请参考以下文章

使用导入和导出向导将平面文件导入 SQL Server

怎样将EXCEL数据导入到sql中

在sql server中选择进入VS导入导出向导

怎样从数据库里把自己需要的数据导出到excel表格中?

从 Excel 导入 SQL Server 2005 时出现截断错误

如何把SQLServer表数据导出为Excel文件