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

前端之家收集整理的这篇文章主要介绍了列创建后,sql server上的列名无效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有人看到这个代码sql Server有什么问题?
  1. IF NOT EXISTS(SELECT *
  2. FROM sys.columns
  3. WHERE Name = 'OPT_LOCK'
  4. AND object_ID = Object_id('REP_DSGN_SEC_GRP_LNK'))
  5. BEGIN
  6. ALTER TABLE REP_DSGN_SEC_GRP_LNK
  7. ADD OPT_LOCK NUMERIC(10,0)
  8.  
  9. UPDATE REP_DSGN_SEC_GRP_LNK
  10. SET OPT_LOCK = 0
  11.  
  12. ALTER TABLE REP_DSGN_SEC_GRP_LNK
  13. ALTER COLUMN OPT_LOCK NUMERIC(10,0) NOT NULL
  14. END;

当我运行这个,我得到:

Msg 207,Level 16,State 1,Line 3
Invalid column name ‘OPT_LOCK’.

on update命令.

谢谢.

解决方法

在这种情况下,您可以通过将列添加为NOT NULL并在一个语句 @L_301_0@中设置现有行的值来避免此问题.

更一般来说,问题是解析/编译问题.在执行任何语句之前,sql Server会尝试在批处理中编译所有语句.

当一条语句引用一个不存在的表时,该语句将被延迟编译.当表已存在时,如果引用非现有列,则会抛出错误.最好的方法是在与DML不同的批处理中进行DDL.

如果一条语句在现有表和不存在的表中都引用了一个不存在的列,那么在编译被推迟之前,错误可能会抛出,也可能不会抛出.

您可以单独批次提交(例如,通过在客户端工具中使用批量分隔符GO),或者在通过使用EXEC或EXEC sp_executesql单独编译的子范围中执行该操作.

第一种方法将需要您将代码重构为IF …不能跨批量.

  1. IF NOT EXISTS(SELECT *
  2. FROM sys.columns
  3. WHERE Name = 'OPT_LOCK'
  4. AND object_ID = Object_id('REP_DSGN_SEC_GRP_LNK'))
  5. BEGIN
  6. ALTER TABLE REP_DSGN_SEC_GRP_LNK
  7. ADD OPT_LOCK NUMERIC(10,0)
  8.  
  9. EXEC('UPDATE REP_DSGN_SEC_GRP_LNK SET OPT_LOCK = 0');
  10.  
  11. ALTER TABLE REP_DSGN_SEC_GRP_LNK
  12. ALTER COLUMN OPT_LOCK NUMERIC(10,0) NOT NULL
  13. END;

猜你在找的MsSQL相关文章