有没有人看到这个代码对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;@H_403_4@当我运行这个,我得到:
@H_403_4@Msg 207,Level 16,State 1,Line 3@H_403_4@on update命令. @H_403_4@谢谢.
Invalid column name ‘OPT_LOCK’.
解决方法
在这种情况下,您可以通过将列添加为NOT NULL并在一个语句
as per my answer here中设置现有行的值来避免此问题.
@H_403_4@更一般来说,问题是解析/编译问题.在执行任何语句之前,sql Server会尝试在批处理中编译所有语句.
@H_403_4@当一条语句引用一个不存在的表时,该语句将被延迟编译.当表已存在时,如果引用非现有列,则会抛出错误.最好的方法是在与DML不同的批处理中进行DDL.
@H_403_4@如果一条语句在现有表和不存在的表中都引用了一个不存在的列,那么在编译被推迟之前,错误可能会抛出,也可能不会抛出.
@H_403_4@您可以单独批次提交(例如,通过在客户端工具中使用批量分隔符GO),或者在通过使用EXEC或EXEC sp_executesql单独编译的子范围中执行该操作.
@H_403_4@第一种方法将需要您将代码重构为IF …不能跨批量.
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;