如何在视图的计算列中强制执行NOT NULL

时间:2010-08-04 15:15:24

标签: sql sql-server-2005 tsql views calculated-columns

我想改变视图如下:

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为“not null”,我想强制columnThree为“not null”。 是可能的,不可能的,隐含的,无用的,或者可能导致严重的问题,因为columnOne只是char(2)填充了algarisms。

我只是想知道语法

4 个答案:

答案 0 :(得分:4)

您可以使用ISNULL()确保null时的默认值。

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 

答案 1 :(得分:4)

如果column1被约束为NOT NULL,则column3不能为NULL,因此无需担心它。

答案 2 :(得分: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

答案 3 :(得分:0)

如何执行它取决于您的业务规则。

您希望这些行不会显示在视图结果中吗?然后将该条件添加到视图WHERE子句中。

如果列为NULL,是否要使用默认值?然后使用COALESCE返回NULL的默认值(只记得别名列。)

如果在基础表中插入一行会导致这样的事情,是否要返回错误?在这种情况下,我会将约束放在基础表上。如果您的视图包含JOIN和聚合,则可能很难,但如果没有具体示例,我就无法提供帮助。

在任何情况下,对于您的特定示例,您不应该看到任何NULL值,因为columnOne是非NULL。