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

具体来说,错误是 Invalid column name 'tagID'.BEGIN TRANSACTIONCOMMIT 之间的代码实际上是一个更大脚本的摘录,但这是相关的摘录(我需要所有这些才能成功或简单地回滚):

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

最佳答案

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

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

关于sql-server - 事务中的 SQL Server 'Invalid column name',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40852785/

10-11 09:02
查看更多