OLE DB 目标:转换规范的无效字符值
OLE DB Destination: Invalid character value for cast specification
我的table来源:
num_facture
TYPE
actif
date
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
列数据类型为:
Column
Data Type
TYPE
tinyint
Actif
tinyint
date
datetime
我正在使用 SSIS 加载我的目的地 table。
因此,我想将 TYPE
更改为
Normal
如果 1
Divers
如果 2
Intra-Société
如果 3
Prospect
如果 4
此外,将 actif
更改为:
no
如果 1
yes
如果 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]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "Invalid character value for cast specification".
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "Invalid character value for cast specification".
[OLE DB Destination [288]] Error: There was an error with OLE DB Destination.Inputs[OLE DB Destination Input].Columns[Derived Column actif] on OLE DB Destination.Inputs[OLE DB Destination Input]. The column status returned was: "The value could not be converted because of a potential loss of data.".
主要的例外是:
Invalid character value for cast specification.
The value could not be converted because of a potential loss of data.
检查目标 SQL table 列数据类型和目标上的列映射。
正如问题中提供的错误描述所示,它是由 OLE DB Destination 组件抛出的。这意味着派生列转换工作正常。
建议阅读以下文章,了解更多SSIS数据类型、数据转换转换、隐式与显式转换:
假设数据类型不匹配是由派生列生成的值引起的。在这种情况下,您可以尝试使用转换运算符或数据转换转换来解决冲突。
此外,您应该知道派生列转换输出的类型是 DT_WTR
或 DT_STR
,因此它们应该映射到 VARCHAR
或 NVARCHAR
目标中的列 table.
更新 1
基于我们对您的相关问题的讨论:。看起来您正试图在 tinyint
列中插入一个字符串值,因为您正试图用等效的字符串值替换类型代码并将其重新插入到 SQL table.
您不应编辑您的数据,因为它经过精心设计和存储。您应该创建另一个 table (例如:TypeReference(Id tinyint, Description VARCHAR(50)) 并存储您在 CASE 语句中使用的所有字符串值。然后您一旦您需要检索字符串值,应该加入两个 tables。
例如:
SELECT myTable.*, TypeReference.Description
FROM myTable LEFT JOIN TypeReference
ON myTable.Type = TypeReference.Id
此外,如果创建 SSIS 包只是为了检索这些值,则无需创建此包。
我的table来源:
num_facture | TYPE | actif | date |
---|---|---|---|
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 |
列数据类型为:
Column | Data Type |
---|---|
TYPE | tinyint |
Actif | tinyint |
date | datetime |
我正在使用 SSIS 加载我的目的地 table。
因此,我想将 TYPE
更改为
Normal
如果 1Divers
如果 2Intra-Société
如果 3Prospect
如果 4
此外,将 actif
更改为:
no
如果 1yes
如果 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]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "Invalid character value for cast specification". An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "Invalid character value for cast specification".
[OLE DB Destination [288]] Error: There was an error with OLE DB Destination.Inputs[OLE DB Destination Input].Columns[Derived Column actif] on OLE DB Destination.Inputs[OLE DB Destination Input]. The column status returned was: "The value could not be converted because of a potential loss of data.".
主要的例外是:
Invalid character value for cast specification.
The value could not be converted because of a potential loss of data.
检查目标 SQL table 列数据类型和目标上的列映射。
正如问题中提供的错误描述所示,它是由 OLE DB Destination 组件抛出的。这意味着派生列转换工作正常。
建议阅读以下文章,了解更多SSIS数据类型、数据转换转换、隐式与显式转换:
假设数据类型不匹配是由派生列生成的值引起的。在这种情况下,您可以尝试使用转换运算符或数据转换转换来解决冲突。
此外,您应该知道派生列转换输出的类型是 DT_WTR
或 DT_STR
,因此它们应该映射到 VARCHAR
或 NVARCHAR
目标中的列 table.
更新 1
基于我们对您的相关问题的讨论:tinyint
列中插入一个字符串值,因为您正试图用等效的字符串值替换类型代码并将其重新插入到 SQL table.
您不应编辑您的数据,因为它经过精心设计和存储。您应该创建另一个 table (例如:TypeReference(Id tinyint, Description VARCHAR(50)) 并存储您在 CASE 语句中使用的所有字符串值。然后您一旦您需要检索字符串值,应该加入两个 tables。
例如:
SELECT myTable.*, TypeReference.Description
FROM myTable LEFT JOIN TypeReference
ON myTable.Type = TypeReference.Id
此外,如果创建 SSIS 包只是为了检索这些值,则无需创建此包。