Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库升级-列名无效_Sql_Sql Server_Tsql_Data Migration - Fatal编程技术网

Sql 数据库升级-列名无效

Sql 数据库升级-列名无效,sql,sql-server,tsql,data-migration,Sql,Sql Server,Tsql,Data Migration,我试图在数据库升级期间迁移数据,我不明白为什么场景1可以工作,但场景2引发了一个异常: 情景1 将过时的表中的数据迁移到新的表中 如果“可废弃”和“可更新”都存在,则可以使用 如果已删除过时表,则无错误 查询场景1: -- NewTable already created IF EXISTS(select * from sys.tables where name = 'NewTable') AND EXISTS(select * from sys.tables where name =

我试图在数据库升级期间迁移数据,我不明白为什么场景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

  • 从过时的列迁移到新的
    • 如果ObsoleteColumn和NewColumn都存在,则此选项有效
    • 给出错误如果已删除“过时”列
查询场景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
味精207,16级,状态1,第4行 列名称“ObsoleteColumn”无效

两种情况基本上是一样的,对吗?仅当存在过时的表/列时,才迁移到新结构。否则忽略


如果我执行场景一,而ObsoleteTable已被删除。它不会失败。那么为什么场景2会失败呢?

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

这也将失败:

CREATE TABLE #xxx(a int)

IF 1 = 2
SELECT xyz FROM #xxx
要避免这种情况,可以使用EXECUTE:

IF 1 = 2
  EXEC('UPDATE MyTable SET NewColumn = ObsoleteColumn')

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

这也将失败:

CREATE TABLE #xxx(a int)

IF 1 = 2
SELECT xyz FROM #xxx
要避免这种情况,可以使用EXECUTE:

IF 1 = 2
  EXEC('UPDATE MyTable SET NewColumn = ObsoleteColumn')

第二个表示
如果something1和something2
其中
something1
为false,则如果该表缺失,则永远不会为true。我看不出这有什么问题。这是因为EXISTS vs=的使用正确地造成了您的混淆。@JarrodRoberson在这两种情况下,我都在检查新旧表/列是否存在。如果新的或过时的数据不存在,则不应(不能)迁移数据。第二个表示
如果something1和something2
其中
something1
为false,则如果该表缺失,则永远不会为true。我看不出这有什么问题。这是因为EXISTS vs=的使用正确地造成了您的混淆。@JarrodRoberson在这两种情况下,我都在检查新旧表/列是否存在。如果新的或过时的不存在,数据不应该(不能)迁移。我理解这是一个典型的错误。但为什么我的工作方式只适用于表而不适用于列?@hwcverwe这是一个非常好的问题。不幸的是,我不知道答案,我知道这是一个典型的错误。但为什么我的工作方式只适用于表而不适用于列?@hwcverwe这是一个非常好的问题。不幸的是,我不知道答案