在使用视图时,是否可以将非空列更改为可空列?(SQL Server)

3
首先,我有两个表格:PersonNames和PersonNameVariations。当搜索一个名字时,它会找到最接近PersonNames中的一个名字,并在PersonNameVariations表格中记录下来(如果还没有记录的话)。
我使用存储过程来搜索传入的PersonNameVariation并返回PersonNames和PersonNameVariations的信息。
由于我使用的是Entity Framework,所以我需要在Import Function中返回一个复杂类型,但不知何故它说我的当前框架不支持它。我的最后选择是在存储过程中使用Entity来返回。
我需要返回的结果是找到的PersonName和进行比较的PersonNameVariation的信息。由于我不能同时返回这两个实体,所以我创建了一个视图PersonSearchVariationInfo,并将其添加到我的Entity Framework中以便将其用作要返回的实体。
问题在于搜索不总是能返回PersonName匹配项。有时它只需要返回PersonNameVariation数据,这意味着与PersonName相关的PersonSearchVariationInfo中的所有字段都需要是可空的。
我该如何使我的视图中的某些字段为空?当我直接在Entity Framework中这样做时,我会得到一个映射错误。
有人有什么想法吗?
谢谢, Matt

um。几天前,gbn 给了你一个很棒的答案。它对你有用吗?如果不行,为什么不行?如果可以,那请接受他的答案。 - Jeff Maass
我得检查一下我做了什么。在我弄清楚之后,我忘记更新这个问题了。他的答案没有直接解决我的情况,但我可能没有清楚地表达我需要什么。我会抽时间写点东西,并尝试澄清我所需要的内容。 - Matt
2个回答

4

或许吧。

你希望什么时候它可为空?在这里,我使用NULLIF来强制可为空性,并假设我有空字符串。当然,你的情况可能不同。

视图中列的元数据对于可空性也是正确的。

CREATE TABLE dbo.Foo (ColNonNull varchar(100) NOT NULL)
GO
INSERT dbo.Foo VALUES (NULL) --fails
GO
INSERT dbo.Foo VALUES ('bar') --works
INSERT dbo.Foo VALUES ('') --works
GO
CREATE VIEW dbo.vwFoo
AS
SELECT NULLIF(ColNonNull, '') AS ColNull FROM dbo.Foo
GO
SELECT * FROM dbo.vwFoo
GO
SELECT
    COLUMNPROPERTY(OBJECT_ID('dbo.Foo'), 'ColNonNull', 'AllowsNull') AS TableColNullable,
    COLUMNPROPERTY(OBJECT_ID('dbo.vwFoo'), 'ColNull', 'AllowsNull') AS ViewColNullable
GO

0

如果底层表是非空的,那么你不能在视图中使列可空。

那你该怎么办呢?在视图中插入一个新行并将该列保留为空值,但在底层表中,你必须提供一个值...这样是行不通的。


我只想选择... 我不想插入到视图中。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接