首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库升级-无效列名

数据库升级-无效列名
EN

Stack Overflow用户
提问于 2016-01-14 14:02:10
回答 1查看 723关注 0票数 0

我试图在数据库升级期间迁移数据,我不明白为什么场景1工作,但是场景2却抛出了一个异常:

场景1

  • 将数据从过时的迁移到新的
    • 如果ObsoleteTable和NewTable同时存在,则起作用。
    • 无错误如果ObsoleteTable已被删除

查询场景1:

代码语言:javascript
运行
复制
-- NewTable already created
IF EXISTS(select * from sys.tables where name = 'NewTable')
AND EXISTS(select * from sys.tables where name = 'ObsoleteTable')
BEGIN
    UPDATE newTable
    SET newTable.Name = obsoleteTable.Name
    FROM dbo.NewTable newTable
    INNER JOIN dbo.ObsoleteTable obsoleteTable
        ON obsoleteTable.Id = newTable.Id
END
-- ObsoleteTable will be removed after this step

场景2

  • 从ObsoleteColumn迁移到新的
    • 如果ObsoleteColumn和NewColumn同时存在,则起作用。
    • 给出错误!,如果ObsoleteColumn已经被删除

查询场景2:

代码语言:javascript
运行
复制
-- NewColumn has been created 
IF EXISTS(select * from sys.columns where object_id = object_id('MyTable') AND name = 'ObsoleteColumn')
AND EXISTS(select * from sys.columns where object_id = object_id('MyTable') AND name = 'NewColumn')
BEGIN
    UPDATE MyTable
    SET NewColumn = ObsoleteColumn
END
-- Obsolete Column will be removed after this step

Msg 207,级别16,状态1,第4行无效列名“ObsoleteColumn”。

这两种情况基本上是一样的,对吧?只有在存在过时的表/列时,才会迁移到新结构。否则就忽略。

如果我在已经删除了的情况下执行场景1,则为ObsoleteTable。不会失败的。那么为什么场景2会失败呢?

EN

回答 1

Stack Overflow用户

发布于 2016-01-14 15:05:40

这是一个典型的错误,列ObsoleteColumn不存在。这意味着即使程序流从未命中该行,查询也将失败。

这也将失败:

代码语言:javascript
运行
复制
CREATE TABLE #xxx(a int)

IF 1 = 2
SELECT xyz FROM #xxx

要避免这种情况,可以使用EXECUTE:

代码语言:javascript
运行
复制
IF 1 = 2
  EXEC('UPDATE MyTable SET NewColumn = ObsoleteColumn')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34791516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档