OLE DB目标:CAST规范的字符值无效

2022-03-31 00:00:00 sql etl sql-server ssis derived-column

我的表源:

编号_制作 类型 活动 日期
1 1 1 2010-01-31 00:00:00.000
2 2 1 2011-01-31 00:00:00.000
3 3 2 2012-01-31 00:00:00.000
4 4 2 2013-01-31 00:00:00.000

列数据类型为:

数据类型
类型 tinyint
活动 tinyint
日期 日期时间

我正在使用SSIS加载我的目标表。

因此,我要将TYPE更改为

  • Normalif 1
  • Diversif 2
  • Intra-Sociétéif 3
  • ProspectIF 4

另请将actif更改为:

  • noIf 1
  • yesif 2

另外,从日期获取资历

因此,我创建了一个具有3列的派生列转换,如下所示:

类型列

TYPE == 1 ? "Normal" : TYPE == 2 ? "Divers" : TYPE == 3 ? "Intra-Société" : TYPE == 4 ? "Prospect" : ""

活动列

actif == 1 ? "No" : actif == 2 ? "yes" : ""

日期列

DATEDIFF("YY",date,GETDATE())

所有这些转换都不起作用。

[OLE DB Destination[288]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80004005。 OLE DB记录可用。来源:Microsoft SQL Server Native Client 11.0&HResult:0x80004005描述:&Quot;CAST规范的字符值无效&Quot;。 OLE DB记录可用。来源:Microsoft SQL Server Native Client 11.0&HResult:0x80004005说明:";CAST规范的字符值无效。

[OLE DB Destination[288]]错误:OLE DB Destination.Inports[OLE DB Destination Input].在OLE DB Destination.Inports[OLE DB Destination Input]上的[Deriated Column Actif]列。返回的列状态为:无法转换值,因为可能会丢失数据。。


解决方案

主要异常为:

转换规范的字符值无效。

无法转换值,因为可能会丢失数据。

检查目标SQL表列数据类型和目标上的列映射。

如问题中提供的错误描述所示,它是由OLE DB目标组件引发的。这意味着派生列转换工作正常。

我建议阅读下面的文章,以了解更多关于SSIS数据类型、数据转换转换、隐式和显式转换的知识:

  • SSIS Data types: Change from the Advanced Editor vs. Data Conversion Transformations
假设数据类型不匹配是由派生列生成的值引起的。在这种情况下,您可以尝试使用强制转换运算符或数据转换转换来解决冲突。

此外,您应该知道派生列转换输出的类型是DT_WTRDT_STR,因此它们应该映射到目标表中的VARCHARNVARCHAR列。


更新1

基于我们对您相关问题的讨论:Derived Column to handled mulitple conditions in CASE statement?。您似乎正在尝试在tinyint列中插入字符串值,因为您正在尝试将类型代码替换为等效的字符串值,并将其重新插入到SQL表中。

您不应编辑您的数据,因为它设计和存储得很好。您应该创建另一个表(例如:TypeReference(ID tinyint,DESCRIPTION VARCHAR(50))并存储您在CASE语句中使用的所有字符串值。然后,一旦需要检索字符串值,您就应该联接这两个表。

例如:

SELECT myTable.*, TypeReference.Description 
FROM myTable LEFT JOIN TypeReference 
     ON myTable.Type = TypeReference.Id

此外,如果创建SSIS包仅用于检索这些值,则不需要创建此包。

相关文章