如何防止SSIS上的CAST错误?

时间:2010-03-11 10:59:36

标签: sql sql-server ssis etl

问题

是否有可能要求SSIS 转换值并且返回NULL 以防不允许使用而不是抛出错误

我的环境

我在Windows Server 2003上使用Visual Studio 2005和Sql Server 2005。

一般情境

万一你好奇,这是我的用例。我必须存储来自通用表(具有历史记录的键/值结构)中某处的数据,其中包含某种值,可以是字符串,数字或日期。结构是这样的:

table Values {
    Id int,
    Date datetime, -- for history
    Key nvarchar(50) not null,
    Value nvarchar(50),
    DateValue datetime,
    NumberValue numeric(19,9)
}  

我想将原始值放在Value列中并尝试将相同的值放入

  • 在DateValue列中,当我能够将其强制转换为Datetime
  • 在NumberValue列中,当我能够将其转换为数字

这两个类型的列会使以后的所有类型的聚合和操作变得更容易和更快。

就是这样,现在你知道我为什么要问这个奇怪的问题了。

============

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您还可以尝试派生列组件并测试潜在日期/数字字段的值,或者只是将其转换并将任何错误重定向为这两个字段的NULL值。

(1)如果您只是在Derived Column组件中每次使用这样的语句转换字段:(DT_DATE)[MYPOTENTIALDATE] - 您可以重定向未通过此转换的行并从那里操作数据。< / p>

OR

(2)您可以在派生列组件中执行类似的操作:ISNULL([MYPOTENTIALDATE])? '2099-01-01':( DT_DATE)[MYPOTENTIALDATE]。我通常在日期为NULL时发送'2099-01-01',而不是使用NULL(使用Cubes等更好地工作)。

当然,如果[MYPOTENTIALDATE]字段与DATETIME或NULL之外的其他内容一起出现,那么(2)将不起作用,即,有时它是“hello”之类的字。

这些是我会探索的选择,祝你好运!

答案 1 :(得分:1)

在处理同样的事情时,我发现SSIS中的错误处理不够具体。我的方法是实际创建一个错误表,并查询将数据存储为varchar的源表,并将错误记录到错误表中,如下所示。我为每个列都有以下语句之一,因为我知道哪个列失败很重要。然后在我记录所有错误后,我执行INSERT,在SomeInfo中选择那些没有错误的记录。在您的情况下,您可以根据errors表中的ColumnName执行更高级的操作,以插入默认值。

INSERT INTO SomeInfoErrors
           ([SomeInfoId]
           ,[ColumnName]
           ,[Message]
           ,FailedValue)    
    SELECT
        SomeInfoId,
        'PeriodStartDate',
        'PeriodStartDate must be in the format MM/DD/YYYY',
                PeriodStartDate
    FROM
        SomeInfo
    WHERE 
        ISDATE(PeriodStartDate) = 0 AND [PeriodStartDate] IS NOT  NULL;

答案 2 :(得分:0)

Tru使用条件拆分,并且数据是日期的记录沿着一条路径行进,另一条路径沿着不同的路径,在插入之前它们被更新为null。