2010-03-11 71 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