执行SSIS包时出现mysql错误

Posted

技术标签:

【中文标题】执行SSIS包时出现mysql错误【英文标题】:mysql error while executing SSIS package 【发布时间】:2011-06-02 19:57:14 【问题描述】:

我正在使用 SSIS 将数据从 MSSQL 传输到 mysql。我已经完成了所有表的映射。但是在执行包时我遇到了错误:

[tabl_name [1056]] 错误:数据插入过程中发生异常,提供者返回的消息是:ERROR [07006] [MySQL][ODBC 3.51 Driver][mysqld-5.1.33-community-log]受限数据类型属性违规(SQL_C_NUMERIC)

[product [402]] 错误:数据插入过程中发生异常,提供程序返回的消息是:无法将“System.Int32”类型的对象转换为“System.Char[]”类型。

我还比较了所有列的数据类型,发现都是一样的。 之后我做了一些研究,发现数据类型小数(10,2)存在问题。但我没有找到解决方案。

提前致谢。

【问题讨论】:

【参考方案1】:

解决此类问题的一个简单方法是将有问题的列从十进制临时转换为 varchar,完成迁移后,将其转换回十进制。

以上可以适用于 MSSQL,因为错误是在 MSSQL 中抱怨的。

【讨论】:

是的..我认为相同的解决方案...但问题是我无法更改 MS SQL 表..所以需要找到某种方式来操作 MySQL.Also 我发现问题出在 BIT 数据类型上,在 MSSQL 中它显示 true 和 false 而不是 0 n 1 ,所以我将数据类型更改为 varchar 并尝试了所有可能性但没有成功......所以我正在寻找 MS SQL Bit 数据类型的 MYSQL 等价物......谢谢跨度> mysql没有BIT数据类型(最接近的是int) 是的......就是这样......我将数据类型更改为 INT,但它不起作用......我尝试了其他数据类型,如 varchar、binary tinyint 和 boolean......仍然没有答案...非常想知道黑客是什么...感谢您的回复。 得到了破解......有一个选项说忽略失败......之后它现在工作正常:) 谢谢。【参考方案2】:

在数据流任务中使用数据转换或在源查询中强制转换无效类型。

将@bit 声明为位 设置@bit = 1 SELECT CAST(@bit as int)

【讨论】:

【参考方案3】:

从 Access 转换为 ODBC 时,我遇到了同样的错误(在 64 位 MS JET 上不会再出现)。我的 FldSeqnr 字段是十进制(15,0) 定义:

        Dim gtSelectSQL As String = "SELECT FldText FROM Data WHERE CollCode = ? AND CollSeq = ? AND FldCode = ? AND FldSeqnr = ?"
        Dim DRgtSelect As odbcDataReader = Nothing
        Dim DbCgtSelect As odbcCommand
        Dim gtSelP1 As New odbcParameter("@CollCode", odbc.odbcType.VarChar, 4)
        Dim gtSelP2 As New odbcParameter("@CollSeq", Odbc.OdbcType.Int, 4)
        Dim gtSelP3 As New odbcParameter("@FldCode", odbc.odbcType.VarChar, 4)
        Dim gtSelP4 As New odbcParameter("@FldSeqnrs", odbc.odbcType.Decimal, 16)
        DbCgtSelect = New odbcCommand(gtSelectSQL, DbConn)
        Dim NrErr As Integer = 0
   Retrysql:
   Try     
        dSelP1.Value = CollCode
        dSelP2.Value = CollSeq
        dSelP3.Value = p.FldCode
        dSelP4.Value = strt
        dSelP5.Value = endn
        DRdSelect = DbCdSelect.ExecuteReader()
        Do While (DRdSelect.Read())
             ...
        End Do
    Catch ex As Exception
        If ex.Message.Substring(0, 13) = "ERROR [07006]" Then
           If NrErr = 0 Then
               NrErr += 1
               GoTo retrySql
           End If
        End If
        MsgBox(ex.ToString())

我知道这很糟糕,但它确实有效:错误仅出现在第一个 ExecuteReader 上。其他一切顺利。

【讨论】:

【参考方案4】:

这周我也同样头疼。我尝试了很多方法。感谢上帝,最后,其中一个起作用了。希望对你有所帮助。

对于一些数据类型为Int、datetime、decimal....的列,这里我标识为ColumnA,我用它作为datetime类型。

    在数据流源中,使用 SQL 命令检索数据。某事喜欢 选择 isnull(ColumnA,'1800-01-01') 作为 ColumnA, C1, C2, ... cn 来自表

确保对具有上述数据类型的所有列使用 Isnull 函数。

    执行 SSIS pkg。它应该可以工作。

    回到Control Flow,在数据流任务下,添加SQL Task控件,将数据替换回来。我的意思是,再次将 ColumnA 从 '1800-01-01' 更新为 null。

这对我有用。在我的情况下,我不能使用忽略失败选项。因为如果这样做,我将丢失数千行数据。

【讨论】:

以上是关于执行SSIS包时出现mysql错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试从主机连接到 mysql docker 容器时出现“读取初始通信数据包”错误

尝试发布 SSAS 表格模型时出现 DevOps 错误

mysql安装时出现错误

访问导入时出现 SSIS 错误

mysql建表时出现错误,代码是1064

使用 INSERT INTO 时出现 MySQL 错误 2002