列创建后,sql server上的列名无效

前端之家收集整理的这篇文章主要介绍了列创建后,sql server上的列名无效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有人看到这个代码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 …不能跨批量.

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;

猜你在找的MsSQL相关文章