【问题标题】:Excel in SSIS: How to import a column that may have more than 255 characters when DT_NTEXT causes failures?SSIS中的Excel:当DT_NTEXT导致失败时,如何导入可能超过255个字符的列?
【发布时间】:2015-01-28 18:40:52
【问题描述】:

好的,所以我的最新项目需要将 Excel 2007 电子表格加载到 SQL Server 表中。我在 SSIS 2008R2 工作。根据我在互联网上找到的一些东西,我在高级编辑器中打开 Excel 源并将长列的数据类型更改为 DT_NTEXT,这样它就不会截断它。然后我创建了数据库列 VARCHAR(MAX)。这可以在我的笔记本电脑上以调试模式正确运行。

然后我将它部署到开发服务器并尝试加载相同的测试文件。它失败并显示以下错误消息:

Error: Code: 0xC0208265
       Source: Main Data Flow Task Get Main Data [1]
       Description: Failed to retrieve long data for column "DESCR".
End Error
Error: Code: 0xC020901C
       Source: Main Data Flow Task Get Main Data [1]
       Description: There was an error with output column "DESCR" (72) on output "Excel Source Output" (9). The column status returned was: "DBSTATUS_UNAVAILABLE".
End Error
Error: Code: 0xC0209029
       Source: Main Data Flow Task Get Main Data [1]
       Description: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR.  The "output column "DESCR" (72)" failed because error code 0xC0209071 occurred, and the error row disposition on "output column "DESCR" (72)" specifies failure on error. An error occurred on the specified object of the specified component.  There may be error messages posted before this with more information about the failure.
End Error

搜索有关该错误的信息时,我发现大约有一百万个网站提供相同的三个建议解决方案:

  1. 将“IMEX=1”添加到连接字符串的扩展属性中。
    它已经在那里了。

  2. 更改注册表中的 TypeGuessRows 键。
    这在服务器上设置为零,我理解这意味着它应该查看整个文件。不过,我将其更改为 8 以匹配我的笔记本电脑。当我再次运行它时发生了同样的错误。然后我将其更改为 1,763,这比电子表格中的行数还多。它仍然给出了同样的错误。所以,我把它归零。 (在我的测试文件的第一行中有一个 1,900 个字符的值,因此在这种情况下,检查多少并不重要。)

  3. 在源中将数据类型更改为 DT_WSTR(4000)。
    该列应该有多达 10,000 个字符,所以我不确定这是否是一个好主意,即使它有效。不过,我还是试过了。这次它给了我一个截断错误。我将截断错误处置更改为“忽略失败”并加载数据,但将值截断为 255 个字符。我已验证长度为 4000 并且在我保存文件时不会更改,但它仍然截断为 255 个字符。

我不知道还能看什么。任何帮助将不胜感激。

更新 1/29:该软件包在预生产服务器上运行时,无需任何更改即可正常工作。在开发服务器上运行时仍然失败。两台服务器具有相同版本的 SSIS(包括次要版本号)以及相同版本的 Windows、Access 和 Excel。我不知道如何解释这一点,也不知道如何判断它是否会在生产中工作。

【问题讨论】:

  • 您加载的是完全相同的文件吗?因为它确实取决于文件中的数据。正如我确定您已经阅读过的那样,驱动程序将读取文件的开头,如果它认为数据类型不同,它会将其更改为更短的类型。简而言之,Excel 很难始终如一地加载。令人惊讶但真实。您是否可以控制如何生成 excel 文件?文字更可靠。
  • 嗨,你能解决这个问题吗?

标签: excel ssis jet


【解决方案1】:

我创建了一个具有类似非功能性要求的新包(Excel 2007 文件、SSIS 2008、SQL Server 2008 R2、VARCHAR(MAX) 目标列),它在部署到数据库服务器后运行良好。我的包裹:

  1. Excel 源组件输出中的元数据(使用高级编辑器检查):DT_NTEXT
  2. 使用 (DT_TEXT,1252) 将源和目标之间的派生列组件从 unicode 转换为非 unicode
  3. OLE DB 目标组件输入的元数据(使用高级编辑器检查):DT_TEXT
  4. 目标列数据类型:VARCHAR(MAX)
  5. 我没有在连接中明确使用扩展属性 IMEX

通过右键单击数据库服务器上的包执行,并将每条记录几千个字符的文件加载到表中而不截断。希望这会有所帮助

【讨论】:

  • 嗯。好吧,我想我还没有尝试从我的连接字符串中删除 IMEX。除此之外,这听起来就像我的包裹的设置方式。我到办公室后会尝试删除 IMEX。
  • 不,我仍然收到相同的错误消息,但没有 IMEX 规范。
【解决方案2】:

我在导入包含超过 255 个字符的字段的 excel 文件时遇到了这个问题。我使用 Python 解决了这个问题。

只需将 excel 导入 pandas 数据框中,然后计算每行每个字符串值的长度。

然后,按降序对数据框进行排序。这将使 SSIS 在扫描前 3 行以分配存储空间时为该字段分配最大空间:

df = pd.read_excel(f,sheet_name=0,skiprows = 1)
df = df.drop(df.columns[[0]], axis = 1)
df['length'] = df['Item Description'].str.len()
df.sort_values('length', ascending=False, inplace=True)
writer = ExcelWriter('Clean/Cleaned_'+f[5:])
df.to_excel(writer,sheet_name='Billing',index=False)
writer.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2011-02-24
    相关资源
    最近更新 更多