将CSV文件导入SQL服务器时操作停止

9

我正在尝试将CSV文件导入到SQL Server数据库中,但没有成功。我对SQL Server还是个新手。

操作停止了...

  • 初始化数据流任务 (成功)

  • 初始化连接 (成功)

  • 设置 SQL 命令 (成功)

  • 设置源连接 (成功)

  • 设置目标连接 (成功)

  • 验证 (成功) 消息

    • 警告 0x80049304: 数据流任务 1: 警告: 无法打开全局共享内存以与性能 DLL 通信; 数据流性能计数器不可用。要解决此问题,请以管理员身份或在系统控制台上运行此包。 (SQL Server 导入和导出向导)
  • 准备执行 (成功)

  • 预执行 (成功) 消息

    • 信息 0x402090dc: 数据流任务 1: 已开始处理文件 "D:\test.csv"。 (SQL Server 导入和导出向导)
  • 执行 (错误) 消息

    • 错误 0xc002f210: 删除表 SQL 任务 1: 执行查询“drop table [dbo].[test]”失败,错误为:“无法删除表 'dbo.test',因为它不存在或您没有权限。”。可能的故障原因:查询存在问题,“ResultSet”属性未正确设置,参数未正确设置或连接未正确建立。 (SQL Server 导入和导出向导)

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

    • 错误 0xc020902a: 数据流任务 1: “输出列“Code”(38)”失败,因为发生了截断,并且“输出列“Code”(38)”上的截断行处理指定截断时失败。指定组件的指定对象发生了截断错误。 (SQL Server 导入和导出向导)

    • 错误 0xc0202092: 数据流任务 1: 在数据行 21 上处理文件“D:\test.csv”时发生错误。 (SQL Server 导入和导出向导)

    • 错误 0xc0047038: 数据流任务 1: SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED。组件“源 - test_csv”(1)上的 PrimeOutput 方法返回错误代码 0xC0202092。当管道引擎调用 PrimeOutput() 时,组件返回了一个失败代码。故障代码的含义由组件定义,但错误是致命的,管道停止执行。可能会在此之前发布更多有关故障的信息。 (SQL Server 导入和导出向导)

  • 复制到 [dbo].[test] (已停止)

  • 后执行 (成功) 消息

    • 信息 0x402090dd: 数据流任务 1: 已结束处理文件 "D:\test.csv"。 (SQL Server 导入和导出向导)

    • 信息 0x402090df: 数据流任务 1: 在“组件“Destination - test”(70)”中插入数据的最终提交已开始。 (SQL Server 导入和导出向导)

    • 信息 0x402090e0: 数据流任务 1: 在“组件“Destination - test”(70)”中插入数据的最终提交已结束。 (SQL Server 导入和导出向导)

    • 信息 0x4004300b: 数据流任务 1: “组件“Destination - test”(70


1
看到以下错误信息:“无法删除表'dbo.test',因为它不存在或您没有权限。” - Mitch Wheat
6个回答

14

"文本被截断或一个或多个字符在目标代码页中无法匹配。"

这种情况可能发生在以下情况下:

  • 您的源扁平文件是UNICODE文件

以及

  • 您的目标列定义为nvarchar(max)。

我花了一段时间才弄清楚这个问题的原因。

原因

SSIS从扫描前N行并做出合理猜测来推断源文件中的数据类型。由于不断重复尝试使其工作,它已将数据类型(OutputColumnWidth)的元数据停放到50个字符的某个地方,导致包内部截断。

解决方法

您需要在“高级”选项卡中调整数据源元数据来解决此问题。通过在“建议类型”的设置上玩弄整个设置,或者逐个字段地微调设置来尝试重置整个设置。在我的情况下(输入文件比较广泛),需要非常令人沮丧的迭代,但最终您可以使其正常工作。


8
您的导入过程中存在两个主要问题:

错误 0xc002f210:删除表格 SQL Task 1: 执行查询 "drop table [dbo].[test] " 失败,原因是: "无法删除表 'dbo.test',因为该表不存在或您没有权限。"。

看起来您正在尝试删除一个根本不存在的表格。解决方案:不要这样做!

错误 0xc02020a1:数据流任务 1: 数据转换失败。列""Code""的数据 转换返回状态值 4 和状态文本 "Text was truncated or one or more characters had no match in the target code page."。

您的 "Code" 列明显比目标表格中生成的列更长。请检查映射 - 可能这是一个非常长的字符串,而 SQL Server 中 VARCHAR 列的默认长度太小了。将目标列的数据类型更改为例如 VARCHAR(MAX) - 这给您提供了 2 GB 的空间!应该足够了....

此外,似乎 "Code" 列包含在 SQL Server 当前选择的代码页中不存在的字符 - 您可以在导入之前去除这些特殊字符吗?如果不能,请使用 NVARCHAR(MAX) 作为目标列的数据类型,以允许其使用 Unicode 来处理其字符(从而支持输入字符串中最奇特的字符)。


1

我遇到了同样的问题:

Error 0xc02020a1: Data Flow Task 1: Data conversion failed. The data conversion for column "target" returned status value 4 and status text "Text was truncated or one or more characters had no match in the target code page.".

解决方案是进入"高级选项"并将列宽更改为255。

1

或者您也可以通过进入高级选项来检查文本的大小,然后检查建议,并将字符串转换为Unicode字符串。这有助于解决与字符串相关的错误。最近我一直在面对这些问题!


0

鉴于这个东西非常快,建议使用建议类型并根据字段逐个调整设置。如果您直接创建最终表格,则可能需要稍微增加列宽以便进行后续数据输入。我建议只计算导入文件中的行数,并将整个集合作为您的“样本”进行扫描。任何不足之处都可能导致错误。调整它的时间可能不值得您的时间。


0
对于“错误0xc02020a1”,我的问题是通过更改CSV文件侧的单元格格式来解决的: (通过Excel打开CSV文件>>将单元格格式从百分比更改为常规,然后保存),这解决了我的问题。

这不是问题的根本原因,因此不是一个好的答案。 - rene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接