繁体   English   中英

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

[英]How to enforce NOT NULL in a view's computed column

我想改变一个视图如下:

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

我只是想知道语法

您可以使用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 

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

如果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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM