我试图在数据库升级期间迁移数据,我不明白为什么场景1工作,但是场景2却抛出了一个异常:
场景1
查询场景1:
-- 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
查询场景2:
-- 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会失败呢?
发布于 2016-01-14 15:05:40
这是一个典型的错误,列ObsoleteColumn不存在。这意味着即使程序流从未命中该行,查询也将失败。
这也将失败:
CREATE TABLE #xxx(a int)
IF 1 = 2
SELECT xyz FROM #xxx
要避免这种情况,可以使用EXECUTE:
IF 1 = 2
EXEC('UPDATE MyTable SET NewColumn = ObsoleteColumn')
https://stackoverflow.com/questions/34791516
复制相似问题