事务中的 SQL Server '无效的列名'

cha*_*eon 5 sql-server

我有一个脚本,我在其中向表中添加一列,并在我用另一个表中的数据填充该列之后立即。我在添加的列上收到“无效的列名”错误。

错误,具体来说,是 Invalid column name 'tagID'.

BEGIN TRANSACTION和之间的代码COMMIT实际上是一个更大脚本的摘录,但这是相关的摘录(我需要所有这些才能成功或简单地回滚):

BEGIN TRY
BEGIN TRANSACTION
  ALTER TABLE [Items] ADD tagID [uniqueidentifier] NULL

  MERGE INTO
    Items AS target
  USING
    Tags AS t ON t.tag = target.tag
  WHEN MATCHED THEN
    UPDATE SET target.tagID = t.id;
COMMIT
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION
END CATCH
GO
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

SQL Server 尝试编译批处理中的所有语句。如果表不存在,则语句的编译会被推迟,但对于缺失的列没有延迟编译。

您可以使用

BEGIN TRY
BEGIN TRANSACTION
  ALTER TABLE [Items] ADD tagID [uniqueidentifier] NULL
  EXEC('
  MERGE INTO
    Items AS target
  USING
    Tags AS t ON t.tag = target.tag
  WHEN MATCHED THEN
    UPDATE SET target.tagID = t.id;
 ')
COMMIT
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION
END CATCH
GO
Run Code Online (Sandbox Code Playgroud)

将列的使用推送到创建列后编译的子批次中。它仍然属于在父作用域中打开的同一个事务。