我有一个脚本,我将一列添加到表中,并在我用另一个表中的数据填充该列之后立即。我在添加的列上收到“无效的列名”错误。
具体来说,错误是 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
最佳答案
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/