Sql server 即使未执行该过程,列也不存在

Sql server 即使未执行该过程,列也不存在,sql-server,tsql,Sql Server,Tsql,我有两个独立的程序。一个过程使用新列更改现有表。另一个过程将数据添加到表中。它们不是被执行的,只是被创建的。当我点击run时,向列添加数据的过程抛出一个错误,表示该列不存在。我知道它不是因为我没有执行包含修改过的代码的过程而创建的。我不知道为什么程序中的代码会执行,因为我认为它只创建了程序 有些代码是重复的,我理解。这只是为了在动态修改之前获得一个有效的解决方案 要比我的注释更全面地回答这个问题,需要编译存储过程。因此,如果您尝试执行无效的操作,编译将失败。它不仅在运行时被检查 尝试此操作,每

我有两个独立的程序。一个过程使用新列更改现有表。另一个过程将数据添加到表中。它们不是被执行的,只是被创建的。当我点击run时,向列添加数据的过程抛出一个错误,表示该列不存在。我知道它不是因为我没有执行包含修改过的代码的过程而创建的。我不知道为什么程序中的代码会执行,因为我认为它只创建了程序

有些代码是重复的,我理解。这只是为了在动态修改之前获得一个有效的解决方案


要比我的注释更全面地回答这个问题,需要编译存储过程。因此,如果您尝试执行无效的操作,编译将失败。它不仅在运行时被检查

尝试此操作,每次都会失败:

create table junk(a int)

create procedure p as
update junk set b=1

如果希望这样做,请在尝试创建插入数据的过程之前运行创建列的过程,或者更改插入过程,使其使用动态sql

请注意,如果您非常希望数据库没有列,但有一个引用它们进行插入的过程,则可以创建列,创建插入过程,然后再次删除列。该过程不会运行,因为删除列会使其无效,但它仍然存在


不太清楚为什么要这样做-db模式在很大程度上是设计时的事情,所以设计应该是渐进的。如果您正在使用前端语言进行更广泛的工作,请查看一个数据库迁移工具—它是一个运行脚本(通常在应用程序启动时)的设备,可确保db拥有应用程序运行该版本所需的所有列和数据。它通常也是双向的,所以如果你降级,那么迁移将/可以删除它添加的列和数据

不是我,但可能是因为你粘贴了代码和错误的图片,而不是剪切和粘贴到你的问题中。为了回答你的问题,正在编译过程,因为该列不存在,编译失败。我怀疑如果你在一个进程中完成了它,它会工作,因为编译器可以在你更新之前计算出你正在创建的代码。