C# 向现有SQL Server表中添加列-含义
我在SQL Server中有一个包含现有条目的现有表(事实上超过100万条) 此表由前端应用程序定期更新、插入和选择。我想/需要添加一个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() 每当按下前端上的按钮并调用存储过程时。此列将按要求添加到现有报告中 我的问题和答案是。作为我们应用程序的核心表之一,修改表并添加额外的列是否会打破其他现有查询?显然,如果不为所有列指定所有值,就无法插入到
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。表值(…)<代码>,并且不指定要使用的列的列表。如果您添加了一个新列,则这些插入将全部中断。这是必须考虑的。考虑到这一点,将提交报告。非常感谢。