開篇介紹
前幾天碰到這樣的一個問題,在 Lookup 中如何設置大小寫不敏感比較,即如何在 Lookup 中的字符串比較時不區分大小寫?
實際上就這個問題已經有很多人提給微軟了,但是得到的結果就是 Closed and Won’t fix。 說白了,這個就是 By Design,包括到現在的 2012 也沒有這個配置選項。
看看大家的抱怨,其實還是非常期望能夠加上這個功能的。
Lookup 大小寫的處理
還是來了解一下 Lookup 中這個特征吧。
通常情況下,我們一般選擇的都是 Full Cache 全緩存模式(關於 Lookup 緩存的幾種模式,大家可以參考我的另外一篇文章 - 微軟BI 之SSIS 系列 - Lookup 組件的使用與它的幾種緩存模式 - Full Cache, Partial Cache, NO Cache)。選擇全緩存模式就意味着在這個 Task 真正執行之前,在 Lookup 中的數據將全部首先被緩存,緩存完成之后再開始執行操作。但是在這里就要注意,如果選擇的是全緩存,默認的字符串比較就是區分大小寫的 CASE SENSITIVE 模式。
Full Cache 的時候采用的是 Windows Collations 中的區分大小寫的比較方式。只有不使用 Full Cache 的時候才能使用到 SQL Collations。那我們知道,除了 Full Cache 外,還有 Partial Cache 部分緩存和 No Cache 不緩存。也就是說,如果使用了 Partial Cache 和 No Cache 緩存模式,使用的就是 SQL Collations。
那是不是采用了 Partial Cache 和 No Cache 就可以不區分大小寫進行字符串比較呢?這種說法也不全正確!
因為這要取決於你 Lookup 中數據庫本身的 Collations 設置 –
如果選擇的 Collation 使用的是CI就是不區分大小寫 (Case Insensitive),如果是CS(Case Sensitive)就是區分大小寫。一般情況下,默認的都是 CI,所以這也就是很多人認為選擇了 Partial Cache 或者 No Cache 就能區分大小寫的原因,但是這個觀點需要被糾正一下。
如何在使用 Lookup 的時候不區分大小寫?
方法一
使用 Partial Cache 或者 No Cache 並確認 Lookup 中連接的數據源數據庫的 Collation 是 Case Insensitive 方式。但是這種方式就意味着要放棄 Lookup 的 Full Cache,而在通常情況下,使用 Full Cache 的效率更高一些,參看- 微軟BI 之SSIS 系列 - Lookup 組件的使用與它的幾種緩存模式 - Full Cache, Partial Cache, NO Cache。
方式二
還是使用 Full Cache,但是在進入 Lookup 的 Task 和 Lookup Task 本身的數據查詢就不要使用表或者視圖方式了,而是改為 T-SQL 查詢的方式,那么通過設置兩個比較源的 UPPER() / LOWER() 就可以達到忽略大小寫比較的目的了! 當然如果上游數據是非數據表而是文件等其它類型,則可以使用其它比如 Derived Column 等使用函數來轉變大小寫也是可以的。
更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。