代码之家  ›  专栏  ›  技术社区  ›  Matt

在视图中使用时,是否可以使不可为空的列为空?(SQLServer)

  •  3
  • Matt  · 技术社区  · 15 年前

    首先我有两张桌子, PersonNames PersonNameVariations . 当搜索一个名称时,它将查找与中可用名称之一最接近的名称。 人名 并记录在 人名变体 如果桌子不在里面的话。

    我正在使用存储过程搜索 人名 因为一个过客 PersonNameVariation 并返回 PersonName 找到了 人名变异 与之相比。

    因为我使用的是实体框架,所以需要在 Import Function 但出于某种原因,它说我目前的框架不支持它。我最后的选择是使用 Entity 而是返回我的存储过程。

    我需要的结果是 人名 那是被发现的 人名变异 那是有记录的。因为我不能返回两个实体,所以我创建了一个视图 PersonSearchVariationInfo 并将其添加到我的实体框架中,以便将其用作要返回的实体。

    问题是 搜索不会总是返回 Person Name 比赛 . 它只需要能够返回 人名变异 数据在某些情况下,意味着 个人搜索变量信息 关于 人名 需要为空 .

    我怎样才能采取我的观点,并使一些字段为空?当我直接在实体框架中执行此操作时,会出现映射错误:

    错误4错误3031:从第1202行开始映射片段时出现问题:表myproject_vw_personsearchvariationinfo中添加的不可为空的列myproject_vw_personsearchvariationinfo.date被映射到可为空的实体属性。 C:\users\administrator\documents\Visual Studio 2010\projects\myproject\myproject.domain\entityframework\myprojectdbentities.edmx 1203 15 myproject.domain

    有人有什么想法吗?

    谢谢,
    马特

    2 回复  |  直到 15 年前
        1
  •  4
  •   gbn    15 年前

    也许。

    你想什么时候取消?在这里,我使用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
    
        2
  •  0
  •   marc_s MisterSmith    15 年前

    不如果列在基础表中不可为空,则不能使其在视图中为空。

    你会怎么处理??在视图中插入新行并保留该列为空,但在基础表中,必须提供一个值….那是行不通的。