7

我正在尝试使用视图来创建使用视图的 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 来做这样的事情之前,我问这个是因为我有大量的实体要以这种方式创建。

4

4 回答 4

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。如果用作杂物很危险。请记住,一旦创建了视图with schemabinding,就根本无法更改任何基础表模式。这意味着您不能在不删除并重新添加所有已启用的视图varchar(50)的情况下创建列。是的,您可以索引模式绑定的视图,但在锁定、库存和桶之前肯定需要考虑权衡。varchar(100)with schemabinding

于 2009-08-21T13:51:47.263 回答
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

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

干杯。

于 2009-08-21T01:30:55.817 回答
1

我用ISNULL这个。即以下内容对我有用:

CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = ISNULL(uniqueidentifier, /*some computed value */)
      ,Field1
      ,Field2
      ,Field3
  FROM tbSample
于 2017-01-10T15:33:25.810 回答
0

使用newid()

CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = NEWID()
      ,Field1
      ,Field2
      ,Field3
  FROM tbSample
于 2009-08-15T12:46:30.620 回答