有没有人看到这个代码对sql Server有什么问题?
IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = 'OPT_LOCK' AND object_ID = Object_id('REP_DSGN_SEC_GRP_LNK')) BEGIN ALTER TABLE REP_DSGN_SEC_GRP_LNK ADD OPT_LOCK NUMERIC(10,0) UPDATE REP_DSGN_SEC_GRP_LNK SET OPT_LOCK = 0 ALTER TABLE REP_DSGN_SEC_GRP_LNK ALTER COLUMN OPT_LOCK NUMERIC(10,0) NOT NULL END;
当我运行这个,我得到:
Msg 207,Level 16,State 1,Line 3
Invalid column name ‘OPT_LOCK’.
on update命令.
谢谢.
解决方法
在这种情况下,您可以通过将列添加为NOT NULL并在一个语句
as per my answer here中设置现有行的值来避免此问题.
更一般来说,问题是解析/编译问题.在执行任何语句之前,sql Server会尝试在批处理中编译所有语句.
当一条语句引用一个不存在的表时,该语句将被延迟编译.当表已存在时,如果引用非现有列,则会抛出错误.最好的方法是在与DML不同的批处理中进行DDL.
如果一条语句在现有表和不存在的表中都引用了一个不存在的列,那么在编译被推迟之前,错误可能会抛出,也可能不会抛出.
您可以单独批次提交(例如,通过在客户端工具中使用批量分隔符GO),或者在通过使用EXEC或EXEC sp_executesql单独编译的子范围中执行该操作.
IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = 'OPT_LOCK' AND object_ID = Object_id('REP_DSGN_SEC_GRP_LNK')) BEGIN ALTER TABLE REP_DSGN_SEC_GRP_LNK ADD OPT_LOCK NUMERIC(10,0) EXEC('UPDATE REP_DSGN_SEC_GRP_LNK SET OPT_LOCK = 0'); ALTER TABLE REP_DSGN_SEC_GRP_LNK ALTER COLUMN OPT_LOCK NUMERIC(10,0) NOT NULL END;