转换时SSIS可能会丢失数据

时间:2017-07-23 08:21:22

标签: sql-server ssis etl

使用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'

使用不同的我得到这些值:

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中使用数据转换:

enter image description here

1 个答案:

答案 0 :(得分:0)

你必须考虑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'