如何在视图中将列指示为 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`
如果 csv 列标题包含空格,则在 spark 中将 csv 转换为 parquet 会出错