2014-07-05 66 views
1

我們有一些大型的數據倉庫表。我們的轉換代碼確保所有數值度量列都使用零而不是NULL用於T-SQL數學。最快的T-SQL將多個列中的零轉換爲NULL

(CASE WHEN NULL or '' then 0) 

在最後轉換部分,我們需要把所有的零回NULL在Analysis Services的MDX使用。試圖確保報告中沒有顯示No Data行。此前設定爲0爲SQL數學,因爲SQL 1 + NULL = NULL,我們希望它等於1

where as 1 + NULL in Analysis Services = 1. 

它需要大約兩個小時做的每一列/測量單個組語句後面的轉換。我正在尋找一種方法來完成一次讀取表/文件而不是三十三個表掃描。

下面的工作會不會更快?

UPDATE MyTable 
    SET Col1 = NULLIF(Col1, 0), 
     Col2 = NULLIF(Col2, 0), 
     Col3 = NULLIF(Col3, 0) 
WHERE (Col1 = 0 
     OR Col2 = 0 
     OR Col3 = 0)     
+0

你能說清楚你到底想幹什麼嗎?您希望在您指定的數字列中使用空值而不是0爲Analysis Services提供結果集嗎? – SlimsGhost

+0

那麼如何區分最初爲零的值和最初爲NULL的值呢?將零轉換爲NULL,反之亦然會改變AVG的結果。 –

+0

你實際上是否必須使用'update'?在表中的視圖中使用轉換並將此視圖用作Analysis Services中事實表的基礎(或者在DSV中的命名查詢中進行轉換)不會節省更新表的時間? – FrankPl

回答

1

你怎麼知道它速度不夠快?你做過任何板凳標記嗎?你還可以使用如下的條件CASE,但是每MSDN Spec都是一樣的。其中規定:

NULLIF等效於搜索的CASE表達式,其中兩個 表達式相等,結果表達式爲NULL。

UPDATE MyTable 
SET Col1 = CASE WHEN Col1 = 0 THEN NULL END, 
Col2 = CASE WHEN Col2 = 0 THEN NULL END, 
Col3 = CASE WHEN Col3 = 0 THEN NULL END 
WHERE (Col1 = 0 OR Col2 = 0 OR Col3 = 0)