我使用SSIS将数据从MSSQL转移到MySQL。我已经完成了所有表的映射。但是在执行包时我遇到了错误:
[tabl_name [1056]]错误:数据插入期间发生异常,从提供程序返回的消息为:ERROR [07006] [MySQL] [ODBC 3.51驱动程序] [mysqld-5.1.33-community-log]受限制的数据类型属性违规(SQL_C_NUMERIC)
[product [402]]错误:数据插入期间发生异常,从提供程序返回的消息是:无法将类型为'System.Int32'的对象强制转换为'System.Char []'。
我还比较了所有列的数据类型,我发现它相同。 之后我做了一些研究,发现数据类型为十进制有问题(10,2)。但我找到了解决方案。
提前致谢。
答案 0 :(得分:0)
摆脱这类问题的一种简单方法是在完成迁移后将有问题的列从十进制临时转换为varchar,然后将其转换回十进制。
以上内容可以应用于MSSQL,因为错误是在MSSQL上引发的。
答案 1 :(得分:0)
在数据流任务中使用数据转换或在源查询中转换无效类型。
DECLARE @bit as bit set @bit = 1 SELECT CAST(@bit as int)
答案 2 :(得分:0)
从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上。所有其他人都顺利。
答案 3 :(得分:0)
本周我头痛得厉害。我尝试了很多方法。感谢上帝,最后,其中一人工作。希望它可以帮助你一点点。
对于数据类型为Int,datetime,decimal ....的一些列,在这里,我将其标识为ColumnA,并将其用作日期时间类型。
确保对前面提到的数据类型的所有列使用Isnull函数。
执行SSIS pkg。它应该有效。
返回Control Flow,在数据流任务下,添加SQL Task控件以替换数据。我的意思是,从' 1800-01-01'更新ColumnA再次归零。
这对我有用。在我的情况下,我不能使用忽略失败选项。因为如果我这样做,我将丢失数千行数据。