2017-06-06 21 views
1

作爲我們的OLAP建模工作流的一部分,我們通常會截斷字段,因爲上游數據源沒有限制或定義的數據類型。如果是自由形式的用戶輸入,則應該是10個字符的字符串的字段有時可以是50或100個字符。我被告知這可能會導致下游流程出現問題,這些流程涉及上傳到外部來源。如何在使用LEFT截斷列時記錄或通知()

我被要求找到一種方法來識別其中一個或多個這些字段被截斷的實例。

我們如何處理這些領域現在是這樣的:

SELECT 
    LEFT(FreeResponseField, 10) AS Comment 
INTO 
    dbo.ModeledTable 
FROM 
    dbo.SourceTable 

從本質上講,如果字段大於10個字符,誰在乎,我們只取前10

如果dbo.SourceTable.FreeResponseField有長度大於10,現在我們想以某種方式知道(是警告/錯誤消息還是插入到日誌表中)。我們有很多帶有很多字段的表,所以上面的例子是一個簡化。僅僅識別出現這種情況的字段和/或表中的元組將有助於查看這些問題發生的位置。

是這樣的可能嗎?您不能僅將源表的數據類型與目標表進行比較,因爲源表將所有內容設置爲VARCHAR(MAX)。天真的方法是根據目標表的定義長度檢查每個元組的每個值的長度。

+2

'我們經常截斷字段,因爲上游數據源沒有限制或定義的數據類型,這聽起來像一個糟糕的設計,真的,特別是如果您知道目標表是什麼數據類型。我認爲在這種情況下,檢查長度將是要走的路 – Lamak

+1

只需在表中添加一個位/ int字段並使CASE語句標記已被截斷的行就足夠了? @Lamak有時上游的數據問題是不可避免的(數據來自外部來源,需要進行標準化或清理等) –

+0

@JacobH我認爲我最大的問題是我不知道是否有一個乾淨的方法來確定何時LEFT()實際上減少了一個字段的長度。 [這個答案](https://stackoverflow.com/a/15091989/3220769)有一點幫助,但我想要觸發一個事件或更新時長度> X – TomNash

回答

1

最初的規範並不是描述性的,但我已經想出了一個解決方案,並認爲我會分享以防因某種原因而出現這種情況。

想象一下,我們有一個SourceTable正在拉入我們的模型。我們已經確定郵政編碼爲長度爲5和的是長度25的地址說,我們有以下兩個記錄:

CustomerID | ZipCode | Address 
     1 | 90210 | 123 Fake Street 
     2 | 902106 | 546 Fake Street 

根據我們的模型定義,存在與ZipCode備案,其中CustomerID等號的錯誤2.我們想找出這兩個ZipCode爲問題的領域,其中CustomerID等於記錄2.用CROSS APPLY下面的查詢做的是:

WITH CTE AS (
    SELECT 
     CustomerID, 
     ZipCodeFlag = IIF(LEN(ZipCode) > 5, 1, 0), 
     AddressFlag = IIF(Len(Address) > 25, 1, 0), 
     ZipCode, 
     Address 
    FROM 
     SourceTable 
) 
SELECT 
    CustomerID, 
    TruncatedField, 
    RawValue 
FROM 
    CTE 
CROSS APPLY (
    VALUES ('ZipCode', ZipCodeFlag, ZipCode), 
      ('Address', AddressFlag, Address) 
) CA(TruncatedField, TruncatedFlag, RawValue) 
WHERE 
    TruncatedFlag = 1 
ORDER BY 
    CustomerID 

用下面的輸出:

CustomerID | TruncatedField | RawValue 
     2 |  ZipCode | 902106 
0

如果是自由形式的用戶輸入,則應該是10個字符的字符串的字段有時可以是50或100個字符。

首先,應該是10個字符的字符串的字段應該是10個字符的字符串,而不是50或100。 FieldX應該是10的長度,而FieldY應該是100的長度。這兩個長度意味着業務邏輯的某些部分。你想在哪裏保持這種業務邏輯?

問題是 - 爲什麼你需要跟蹤所有的字符串截斷?

相關問題