2010-08-04 73 views
2

我想改變觀點如下:如何強制執行NOT NULL在視圖中的計算列

ALTER VIEW [dbo].[ViewOne] as 
SELECT columnOne, -- not null 
     columnTwo, --not null 
     (convert(decimal(2,0), columnOne)) as columnThree -- I want this not to be NULL 
FROM DBOne.TableOne 

由於columnOne是「不空」我想迫使columnThree是「不空」也。 由於columnOne是char(2)只填充algarisms,因此是可能的,不可能的,隱式的,無用的或可能導致嚴重問題的。

我只是想知道語法

回答

4

如果Cast的源自身不爲null,則ColumnThree將永遠不會爲null。但是,這並不意味着如果ColumnOne無法被轉換爲decimal(2,0),並且您不知道在查詢視圖之前是否會收到異常。您應該考慮添加額外的檢查來確定演員陣容是否會失敗,並幫助減輕演員製作錯誤的可能性:

Alter View dbo.ViewOne 
As 
Select ColumnOne, ColumnTwo 
    , Case 
     When IsNumeric(ColumnOne) = 0 Then 0 
     Else Cast(ColumnOne As decimal(2,0)) 
     End As ColumnThree 
4

您可以使用ISNULL()當空,以保證默認值。

ALTER VIEW [dbo].[ViewOne] as 
SELECT columnOne, -- not null 
     columnTwo, --not null 
     ISNULL((convert(decimal(2,0), columnOne)),0.00) as columnThree 
FROM DBOne.TableOne 
4

如果column1被約束爲NOT NULL,那麼column3不能爲NULL,所以不需要擔心它。

+0

如果轉換爲十進制失敗失敗,它不能爲空嗎? – Fosco 2010-08-04 15:26:37

+0

轉換失敗是一個例外,該語句將被終止。 – Rabid 2010-08-04 15:42:27

+0

@Fosco - 不會。如果轉換失敗,您將收到錯誤消息。假設轉換成功,如果源已知(即非空),則輸出將是已知的。 – Thomas 2010-08-04 15:43:04

0

您如何實施它取決於您的業務規則。

你想讓這些行不顯示在視圖結果中嗎?然後將該條件添加到視圖WHERE子句中。

如果列將爲NULL,是否要使用默認值?然後使用COALESCE返回NULL的默認值(只記得別名列)。

如果將一行插入到會導致此類事情的基礎表中,是否希望返回錯誤?在這種情況下,我會將約束放在基礎表上。如果您的視圖包含JOIN和聚合,那麼這可能很難,但沒有一個具體的例子,我不能真正幫助。

在任何情況下,對於您的特定示例,您應該看不到任何NULL值,因爲columnOne不爲NULL。