2010-03-11 38 views
4

问题如何防止SSIS上的CAST错误?

是否有可能要问SSIS到蒙上值返回NULL的情况下,中投不准而不是抛出一个错误的?

我的环境

我使用Visual Studio 2005和SQL Server 2005的Windows Server 2003中

一般情况下

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

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

我要把原始值值列,并尝试把相同的值

  • 在DateValue将列时我能投它为datetime
  • 在NumberValue列,当我能够将它投给了许多

这两个类型的列就可以把所有类型的聚集和操纵更容易和更快后来。

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

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

在此先感谢您的帮助。

回答

2

您也可以尝试派生列组件并测试潜在日期/数字字段的值,或者简单地将其转换并将任何错误重定向为这两个字段的NULL值。 (1)如果你只是简单地在Derived Column组件中使用类似下面的语句来转换字段:(DT_DATE)[MYPOTENTIALDATE] - 你可以重定向失败这个转换并且从那里操纵数据的行。

OR

(2)用户可在派生列成分是这样的:ISNULL([MYPOTENTIALDATE])? '2099-01-01':(DT_DATE)[MYPOTENTIALDATE]。当日期为NULL时,我通常会发送'2099-01-01',而不是搞乱NULL(与Cubes等更好地工作)。

如果[MYPOTENTIALDATE]字段作为除DATETIME或NULL之外的其他内容(即有时是“hello”之类的词),当然(2)将不起作用。

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

+0

感谢您的回答。我将调查(1)选项。事实上,我认为它会产生很多错误消息,但事实并非如此。 – 2010-03-15 08:42:49

0

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

+0

感谢您的回答。什么是最好的方法(表达式)猜测字符串值是一个日期或SSIS中的数字(这是我正在寻找的关键) – 2010-03-12 09:36:50

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; 
+0

感谢您的提示。我一定会使用它。 – 2010-03-16 08:58:11