如何在视图中将列指示为 NOT NULL?

Posted

技术标签:

【中文标题】如何在视图中将列指示为 NOT NULL?【英文标题】:How to indicate a columns as NOT NULL in a view? 【发布时间】:2009-08-15 12:36:20 【问题描述】:

我正在尝试使用视图来创建使用视图的 ADO.NET 实体。但是,该视图没有一个不为空的列。

我想到的一件事是在视图上创建一个 NOT NULL 列以用作视图的“主键”。这有效,但该字段仍报告为 NULL。

有没有办法强制或欺骗 SQL Server 将该视图列报告为 NOT NULL?

将视图想象为:

CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = convert(uniqueidentifier, /* some computed value */)
      ,Field1
      ,Field2
      ,Field3
  FROM tbSample

注意: 在说我可以编辑实体 XML 来做这样的事情之前,我问这个是因为我有一个 非常 大量的实体以这种方式创建。

【问题讨论】:

您想在视图中添加顺序主键吗? 如果数据不是自然可识别的,那么为什么要为其添加主键?我怀疑您是否想使用这个假主键加入... 【参考方案1】:

首先,回答你的问题:

您不想使用newid() 来确定您的 id 字段,因为每次使用视图时都会重新计算该字段。确实,数据完整性是最大的问题。

select
    row_number() over (order by someStaticAndUniqueFieldLikeCreateDate) as ID,
    Field1,
    Field2,
    Field3
from
    tblA
order by
    someStaticAndUniqueFieldLikeCreateDate

这仅适用于您对具有一致顺序且将追加新行的字段进行排序,例如CreateDate 字段。如果您没有此 ID,则该 ID 可能会更改。现在,如果您只在运行时需要这些 ID,并且没有任何东西可以永久链接到它们,row_number 将非常热衷。如果您有不可靠的数据,则无法获得可靠的 ID 字段除非您创建一个额外的表并使用触发器来填充它。

其次,小心with schemabinding。如果用作杂物很危险。请记住,一旦您创建了视图with schemabinding,您就无法更改任何基础表的架构根本。这意味着如果不删除并重新添加所有启用了with schemabinding 的视图,就无法将varchar(50) 列设为varchar(100)。是的,您可以索引模式绑定的视图,但在锁定、库存和桶之前,肯定需要考虑权衡。

【讨论】:

【参考方案2】:

我不知道这是否值得,但我认为创建一个返回带有 NOT NULL 字段的临时表的函数应该适用于计算值。例如。

Create function fnSTestample()
returns @Test TABLE 
(
    tableId varchar(100) not null
)
WITH SCHEMABINDING
as
begin
    insert @Test(tableID)
    select 'some computed value' from dbo.someTable
return
end

然后您在视图中选择该函数。

干杯。

【讨论】:

【参考方案3】:

我为此使用了ISNULL。 IE。以下内容对我有用:

CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = ISNULL(uniqueidentifier, /*some computed value */)
      ,Field1
      ,Field2
      ,Field3
  FROM tbSample

【讨论】:

【参考方案4】:

使用newid()

CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = NEWID()
      ,Field1
      ,Field2
      ,Field3
  FROM tbSample

【讨论】:

以上是关于如何在视图中将列指示为 NOT NULL?的主要内容,如果未能解决你的问题,请参考以下文章

iOS in-Call 指示器正在下推视图/内容,修改根视图`frame`

linux中将多列数据转换为指定列数据

如果 csv 列标题包含空格,则在 spark 中将 csv 转换为 parquet 会出错

ScrollViewer - 指示子元素滚动到视图中

UIPageViewController 带有最后一个视图,没有页面指示器

为啥要创建一个二进制列来指示具有缺失值的记录