【问题标题】:SSIS potential loss of data when converting转换时 SSIS 可能丢失数据
【发布时间】:2017-12-29 00:02:39
【问题描述】:

使用 SQL Server 2014 和 SSIS,我在数据流中遇到以下问题:

数据源:出现错误“无法转换值 因为可能会丢失数据。”。

这是查询:

SELECT
    ISNULL(M.ActiveLEDZones, '') [ActiveLEDZones__c]
    , M.Weight [Weight__c]
    , M.WeightStand [WeightStand__c]
    , M.wifi [WIFI__c]
FROM [dbo].[ModelComparison] M 
WHERE CAST(M.CreateDate AS DATE) >= '2012-01-01'

使用 distinct 我得到这些值:

ActiveLEDZones__c
3
126
28
36
12
9
384
72
tbd
128
8
2
14
6
NA
16

1
10
0
N/A
32
18
5
64
4

表格信息:

Source: varchar(5)
Target: nvarchar(5)

我在 SSIS 中使用数据转换:

【问题讨论】:

  • 明确地说,您正在将 ActiveLEDZones__cvarchar(5) 转换为 nvarchar(5)
  • 数据流中的哪个组件产生了错误?来源、转化还是目的地?
  • 是的,我正在将 ActiveLEDZones__c 从 varchar(5) 转换为 nvarchar(5) 并且给我错误的组件是源任务
  • 如果去掉数据转换组件会发生什么?我认为 varchar 会隐式转换为 nvarchar 。另外,源表中CreateDate 列的数据类型是什么?

标签: sql-server ssis etl


【解决方案1】:

你必须考虑2点:

第一

在查询中使用ISNULL(M.ActiveLEDZones, '') [ActiveLEDZones__c] 时,此函数不会采用原始​​列数据长度varchar(5),而是采用此查询中发现的最长长度,这可能会导致类似问题,请尝试使用CAST 函数精确列数据长度。

CAST(ISNULL(M.ActiveLEDZones, '') AS VARCHAR(5)) [ActiveLEDZones__c]

附加测试

使用以下查询创建表并检查创建的表结构:

SELECT
ISNULL(M.ActiveLEDZones, '') [ActiveLEDZones__c]
, M.Weight [Weight__c]
, M.WeightStand [WeightStand__c]
, M.wifi [WIFI__c]
INTO tblTemp_1
FROM [dbo].[ModelComparison] M 
WHERE CAST(M.CreateDate AS DATE) >= '2012-01-01'

还有以下

SELECT
CAST(ISNULL(M.ActiveLEDZones, '') AS VARCHAR(5)) [ActiveLEDZones__c]
, M.Weight [Weight__c]
, M.WeightStand [WeightStand__c]
, M.wifi [WIFI__c]
INTO tblTemp_2
FROM [dbo].[ModelComparison] M 
WHERE CAST(M.CreateDate AS DATE) >= '2012-01-01'

您将看到 tblTemp_1 [ActiveLEDZones__c] 列与 tblTemp_1 不同 [ActiveLEDZones__c]

第二次

您可以使用CAST(ISNULL(M.ActiveLEDZones, '') AS NVARCHAR(5)) 而不是ISNULL(M.ActiveLEDZones, ''),因此源列将被读取为Nvarchar(5),无需使用Data Conversion Componenent

查询将是

SELECT
CAST(ISNULL(M.ActiveLEDZones, '') AS NVARCHAR(5)) [ActiveLEDZones__c]
, M.Weight [Weight__c]
, M.WeightStand [WeightStand__c]
, M.wifi [WIFI__c]
FROM [dbo].[ModelComparison] M 
WHERE CAST(M.CreateDate AS DATE) >= '2012-01-01'

【讨论】:

    猜你喜欢
    • 2022-08-22
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2014-04-19
    相关资源
    最近更新 更多