C# 向现有SQL Server表中添加列-含义

C# 向现有SQL Server表中添加列-含义,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,我在SQL Server中有一个包含现有条目的现有表(事实上超过100万条) 此表由前端应用程序定期更新、插入和选择。我想/需要添加一个datetime列,例如M_DateModified,可以这样更新: UPDATE Table SET M_DateModified = GETDATE() 每当按下前端上的按钮并调用存储过程时。此列将按要求添加到现有报告中 我的问题和答案是。作为我们应用程序的核心表之一,修改表并添加额外的列是否会打破其他现有查询?显然,如果不为所有列指定所有值,就无法插入到

我在SQL Server中有一个包含现有条目的现有表(事实上超过100万条)

此表由前端应用程序定期更新、插入和选择。我想/需要添加一个
datetime
列,例如
M_DateModified
,可以这样更新:

UPDATE Table SET M_DateModified = GETDATE()
每当按下前端上的按钮并调用存储过程时。此列将按要求添加到现有报告中

我的问题和答案是。作为我们应用程序的核心表之一,
修改表并添加额外的列是否会打破其他现有查询?显然,如果不为所有列指定所有值,就无法插入到表中,因此任何现有的
insert
查询都将中断(这是一个巨大的问题)


如果您能提供有关此问题的最佳解决方案,我们将不胜感激

如果新专栏不是强制性的,你就没有什么可担心的了。除非你有一些傻瓜,他们用“*”而不是列列表来编写select语句。

好吧,只要你的select不是*,这些就可以了。对于插入,如果给字段一个默认值GETDATE(),并允许为空,则可以将其排除,它仍将被填充。

取决于其他查询的设置方式。如果它们是
选择[Item1]、[Item2]、ect
。。。。那你就不会面临任何问题了。如果是
SELECT*FROM
,您可能会遇到一些意想不到的结果


记住你想如何设置它,你要么将它设置为可空,这可能会让你适应未来,要么设置一个默认日期,这可能会给你提供不正确的报告、检索、查询等数据。

首先,正如marc_说的,它只会影响
选择*
查询,甚至不是所有人都会受到影响

其次,您只需要在
INSERT
上指定所有非空字段,因此,如果将其设置为可空,您就不必担心这一点。此外,对于
Created\u Date
-类型的列,通常会添加
默认设置
=GetDate()
,如果未指定,将为您填充该设置

第三,如果您仍然担心影响现有代码库,请执行以下操作:

  • 将表重命名为类似“physicalTable”的名称
  • 创建一个与表格同名的视图,该视图执行
    SELECT。。从physicalTable中,以相同的顺序明确列出列,但不包括
    M_DateModified
    字段
  • 不修改代码,现在引用视图,而不是直接访问表
  • 现在,您的代码可以在不做任何更改的情况下安全地与表交互(SQL DML代码无法区分表和这样的可写视图之间的区别)

    最后,这种“ModifiedDate”列是一种常见的需求,并且最常被处理,首先将其设置为NULL,然后添加一个Insert&Update触发器来自动设置它:

    UPDATE t
    SET    M_DateModified = GetDate()
    FROM   (SELECT * FROM physicalTable y JOIN inserted i ON y.PkId = i.PkId) As t
    

    这样应用程序就不必维护字段本身。作为额外的好处,应用程序也不能错误地或错误地设置它(这是SQL中常见且可接受的触发器用法)。

    它将破坏设计糟糕的查询,例如
    SELECT*FROM…
    INSERT
    查询,这些查询没有明确指定要插入的列的列表“显然,如果不为所有列指定所有值,就无法插入到表中”。这不是真的。对不起,@rbaryyoung@rbaryyoung。我的意思是,通过简单的插入,您会得到消息“列名或提供的值的数量与表定义不匹配”。“例如,如果您只提供5个值,而表要求7个值?请原谅,我是新来的:)啊,是的,默认的
    INSERT
    。我已经忘记了它,但是因为它相当于使用“*”作为
    插入
    ,所以你不应该这样做(现在你知道为什么了)。明确指定列。谢谢,以后可以:)很可能存在这样的查询。应用程序是巨大的。或者编写代码< >代码的其他KukkLead插入DBO。表值(…)<代码>,并且不指定要使用的列的列表。如果您添加了一个新列,则这些插入将全部中断。这是必须考虑的。考虑到这一点,将提交报告。非常感谢。