更改表和更新的过程会因无效列而失败

时间:2017-04-11 15:25:34

标签: sql-server stored-procedures sql-update alter-table

我尝试向表中添加新列,然后更新表并使用旧列的日期格式更改设置新列。

我的程序如下:

begin
alter table [dbo].[mytable]
add New_Field1 varchar(24)
end

......

update [dbo].[SMR06_TARGET]
set New_Field1 = convert(varchar(24),Old_Field1,103)

.....

我在表的顶部有多个alter table语句,并在每个新列的底部更新语句。我认为这是一个规则,SQL保持DDL在顶部,DML在底部。

好的,所以每当我执行此操作来创建过程时,它都会失败并且列名New_Field1不正确。我真的无法找出造成这种情况的原因。我尝试了BEGIN的不同变体...... END尝试评论出了违规声明,然后运行,然后再次使用下一个声明失败。

我认为它与语句终止的方式有关。我不确定之前是否使用混合DDL / DML完成了此类程序声明。

任何提示都是最受欢迎的。

由于

安德鲁

2 个答案:

答案 0 :(得分:1)

您需要批处理将该列与更新该列的语句分开添加的语句。

BEGIN TRANSACTION
GO
ALTER TABLE [dbo].[mytable]
ADD New_Field1 varchar(24) NULL
GO

UPDATE [dbo].[mytable]
SET New_Field1 = convert(varchar(24),Old_Field1,103)
GO
ALTER TABLE dbo.Batch SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

答案 1 :(得分:1)

解析器在开始执行第一行之前会检查整个批处理。添加Old_Field1与使用Old_Field1的引用位于同一批次中。在解析器考虑包含Old_Field1的语句时,尚未执行添加Old_Field1的语句,因此该字段尚不存在。

如果您在SSMS中运行,请在每个语句之间包含GO以强制执行多个批处理。如果您在另一个无法使用GO的工具中运行此操作,则您需要单独提交每个语句,以确保在解析下一步之前完全执行它们。