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

时间:2009-08-15 12:36:20

标签: sql tsql view entities

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

我遇到的一件事是在视图上创建一个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来做这样的事情之前,我问这个是因为我有一个非常大量的实体以这种方式创建。

4 个答案:

答案 0 :(得分:4)

首先,回答你的问题:

您不希望使用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。如果用作kludge是危险的。请记住,只要您创建了一个视图with schemabinding,就无法在所有中更改任何基础表的架构。这意味着,如果不删除并重新添加启用了varchar(50)的所有视图,则无法将varchar(100)列设为with schemabinding。是的,您可以索引一个模式绑定的视图,但在锁定,库存和桶之前肯定需要考虑权衡。

答案 1 :(得分:3)

我不知道是否值得付出努力,但我认为创建一个返回带有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

然后在视图中选择该功能。

干杯。

答案 2 :(得分:1)

我使用了ISNULL。即像下面这样的东西对我有用:

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

答案 3 :(得分:0)

使用newid()

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