4

问题

如果不允许转换而不是抛出错误,是否可以要求 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 列中

这两个类型的列将使以后的各种聚合和操作变得更加容易和快捷。

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

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

在此先感谢您的帮助。

4

3 回答 3

2

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

(1) 如果您只是在派生列组件中每次都使用这样的语句简单地转换字段: (DT_DATE)[MYPOTENTIALDATE] - 您可以重定向未通过此转换的行并从那里操作数据。

或者

(2) 您可以在派生列组件中执行以下操作: ISNULL([MYPOTENTIALDATE]) ?'2099-01-01':(DT_DATE)[MYPOTENTIALDATE]。我通常在日期为 NULL 时通过“2099-01-01”发送,而不是弄乱 NULL(与 Cubes 等一起使用效果更好)。

当然,如果 [MYPOTENTIALDATE] 字段作为 DATETIME 或 NULL 以外的其他内容出现,则 (2) 将不起作用,即,有时它是像“hello”这样的词。

这些是我将探索的选项,祝你好运!

于 2010-03-12T15:57:45.993 回答
1

在处理同样的事情时,我发现 SSIS 中的错误处理不够具体。我的方法是实际创建一个错误表,并查询一个将数据存储为 varchar 的源表,并将错误记录到错误表中,如下所示。我对每一列都有以下语句之一,因为知道哪一列失败对我来说很重要。然后在我记录所有错误后,我执行 INSERT,在其中选择 SomeInfo 中没有错误的那些记录。在您的情况下,您可以根据错误表中的 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;
于 2010-03-15T18:38:53.413 回答
0

Tru 使用条件拆分,让数据为日期的记录沿着一条路径走,另一条沿着不同的路径走,在插入之前将它们更新为 null。

于 2010-03-11T19:33:38.740 回答