2011-01-20 66 views
0

只是一個奇怪的問題。我寫了下面的代碼使用CASE語句,但我沒有數據,所以我不知道我的邏輯是否正確。我所做的是我在每個領域應用長度檢查,如果它不匹配,然後把它放在錯誤表中。那麼,任何人都可以告訴我,我的邏輯是否正確?CASE聲明

查詢:

INSERT INTO 
       [Elig].[dbo].[ErrorTable] 
       (
       [SeqId], 
       [CodeId], 
       [SubjectArea], 
       [FieldName], 
       [TableName], 
       [ErrorValue], 
       [ActiveFlag] 
       ) 
       SELECT 
        [sd].[SuscriberDataId] AS [SeqId], 
        @InvalidLength AS [CodeId], 
        @SubjectArea AS [SubjectArea], 
      CASE WHEN len(ltrim(Rtrim([sd].[SubscriberNumber]))) > 9 THEN 'SubscriberNumber' 
       WHEN len(ltrim(Rtrim([sd].[SubscriberLastName]))) > 35 THEN 'SubscriberLastName' 
       WHEN len(ltrim(Rtrim([sd].[SubscriberFirstName]))) > 15 THEN 'SubscriberFirstName' 
       WHEN len(ltrim(Rtrim([sd].[SubscriberMiddleInitial]))) > 1 THEN 'SubscriberMiddleInitial' 
       WHEN len(ltrim(Rtrim([sd].[Sex]))) > 1 THEN 'Sex' 
       WHEN len(ltrim(Rtrim([sd].[Dob]))) > 8 THEN 'Dob' 
       WHEN len(ltrim(Rtrim([sd].[Ssn]))) > 9 THEN 'Ssn' 
       WHEN len(ltrim(Rtrim([sd].[FacetsGroup]))) > 8 THEN 'FacetsGroup' 
      END AS FieldName, 
      'Eligibility.SubscriberData', 
      CASE WHEN len(ltrim(Rtrim([sd].[SubscriberNumber]))) > 9 THEN [SubscriberNumber] 
       WHEN len(ltrim(Rtrim([sd].[SubscriberLastName]))) > 35 THEN [SubscriberLastName] 
       WHEN len(ltrim(Rtrim([sd].[SubscriberFirstName]))) > 15 THEN [SubscriberFirstName] 
       WHEN len(ltrim(Rtrim([sd].[SubscriberMiddleInitial]))) > 1 THEN [SubscriberMiddleInitial] 
       WHEN len(ltrim(Rtrim([sd].[Sex]))) > 1 THEN [Sex] 
       WHEN len(ltrim(Rtrim([sd].[Dob]))) > 8 THEN [Dob] 
       WHEN len(ltrim(Rtrim([sd].[Ssn]))) > 9 THEN [Ssn] 
       WHEN len(ltrim(Rtrim([sd].[FacetsGroup]))) > 8 THEN [FacetsGroup] 
      END AS ErrorValue,   
      @ActiveFlag AS [ActiveFlag] 
      FROM [Eligibility].[SubscriberData] 
      WHERE len(ltrim(Rtrim([sd].[SubscriberNumber]))) > 9 OR 
       len(ltrim(Rtrim([sd].[SubscriberLastName]))) > 35 OR 
       len(ltrim(Rtrim([sd].[SubscriberFirstName]))) > 15 OR 
       len(ltrim(Rtrim([sd].[SubscriberMiddleInitial]))) > 1 OR 
       len(ltrim(Rtrim([sd].[Sex]))) > 1 OR 
       len(ltrim(Rtrim([sd].[Dob]))) > 8 OR 
       len(ltrim(Rtrim([sd].[Ssn]))) > 9 OR 
       len(ltrim(Rtrim([sd].[FacetsGroup]))) > 8 

感謝

+0

你的問題是什麼? – Quassnoi 2011-01-20 14:51:18

回答

0

理想情況下,你的源表應該這樣定義:每個字段不能超過規定的最大大。因此,我正在猜測(希望),在修復基礎表定義之前,這是一個一次性的練習來識別不良數據並修復它。

由於@Matt評論說,在這裏很多len(ltrim(rtrim(,這會讓這個緩慢。

而@Arvo指出,你只會記錄每一行的第一個錯誤 - 例如,如果SubscriberNumberSubscriberLastName都過長,則只會記錄SubscriberNumber

你應該確保你的數據在寫入時被修剪。這將消除整個店鋪需要ltrim(rtrim(。如有必要,在整個表中運行一次性查詢以修復現有數據值。

您的where子句的效率可能與其將會一樣(一旦您失去所有這些修剪),並且可以用來驅動遊標或填充臨時表,然後您可以多次查詢 - 一次每場檢查。

後一種解決方案可能看起來像這樣。首先得有錯誤的行:一次

SELECT 
    [sd].[SuscriberDataId] 
    ,[sd].[SubscriberNumber] 
    ,[sd].[SubscriberLastName] 
    ,[sd].[SubscriberFirstName] 
    ,[sd].[SubscriberMiddleInitial] 
    ,[sd].[Sex] 
    ,[sd].[Dob] 
    ,[sd].[Ssn] 
    ,[sd].[FacetsGroup] 
INTO #temp 
FROM [Eligibility].[SubscriberData] [sd] 
WHERE 
    len([sd].[SubscriberNumber]) > 9 OR 
    len([sd].[SubscriberLastName]) > 35 OR 
    len([sd].[SubscriberFirstName]) > 15 OR 
    len([sd].[SubscriberMiddleInitial]) > 1 OR 
    len([sd].[Sex]) > 1 OR 
    len([sd].[Dob]) > 8 OR 
    len([sd].[Ssn]) > 9 OR 
    len([sd].[FacetsGroup]) > 8 

然後,對於一個場,得到其打破規則的行:

-- SubscriberNumber check 
INSERT INTO [Elig].[dbo].[ErrorTable] 
    (
     [SeqId], 
     [CodeId], 
     [SubjectArea], 
     [FieldName], 
     [TableName], 
     [ErrorValue], 
     [ActiveFlag] 
    ) 

SELECT 
    [t].[SuscriberDataId], 
    @InvalidLength, 
    @SubjectArea, 
    'SubscriberNumber', 
    'Eligibility.SubscriberData', 
    [t].[SubscriberNumber], 
    @ActiveFlag 
FROM #temp 
WHERE len([t].[SubscriberNumber]))) > 9 

重複下一個字段等