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