代码之家  ›  专栏  ›  技术社区  ›  Paulo Santos

如何在视图中将列指示为非空?

  •  7
  • Paulo Santos  · 技术社区  · 16 年前

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

    有没有办法强制或欺骗SQL Server将该视图列报告为非空?

    将视图想象为:

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

    注: 在说我可以编辑实体XML来做这样的事情之前,我问这个问题是因为我有一个

    4 回复  |  直到 16 年前
        1
  •  4
  •   Eric    16 年前

    首先,回答你的问题:

    newid() 来确定您的id字段,因为每次使用视图时都会重新计算该字段。实际上,数据完整性是最大的问题。

    select
        row_number() over (order by someStaticAndUniqueFieldLikeCreateDate) as ID,
        Field1,
        Field2,
        Field3
    from
        tblA
    order by
        someStaticAndUniqueFieldLikeCreateDate
    

    这仅在您对字段排序时有效,该字段将具有一致的排序,并将追加新行,例如 CreateDate 领域如果您没有此项,则该ID可能会更改。现在,如果您在运行时只需要这些ID,并且没有永久链接到它们的内容, row_number 除非 您可以创建一个附加表并使用触发器填充它。

    with schemabinding . 如果用它来当挡箭牌是很危险的。请记住,一旦创建视图 诡计多端 ,则不能更改的架构 任何 基础表 完全 . 这意味着你不能做一个决定 varchar(50) a列 varchar(100) 无需删除并重新添加所有具有 启用。是的,您可以为一个充满模式的视图编制索引,但在进行锁定、存储和存储之前,肯定需要考虑一些权衡。

        2
  •  3
  •   dkartopr    16 年前

    我不知道这样做是否值得,但我认为创建一个返回带有非空字段的临时表的函数应该适用于计算值。前任。

    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
    

    然后在视图中选择该函数。

    干杯

        3
  •  1
  •   moudrick    9 年前

    我曾经 ISNULL 为了这个。也就是说,以下类似的东西对我起了作用:

    CREATE VIEW vwSample WITH SCHEMABINDING
    AS
    SELECT ID = ISNULL(uniqueidentifier, /*some computed value */)
          ,Field1
          ,Field2
          ,Field3
      FROM tbSample
    
        4
  •  0
  •   Preet Sangha    16 年前

    使用 newid()

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