我尝试向表中添加新列,然后更新表并使用旧列的日期格式更改设置新列。
我的程序如下:
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完成了此类程序声明。
任何提示都是最受欢迎的。
由于
安德鲁
答案 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的工具中运行此操作,则您需要单独提交每个语句,以确保在解析下一步之前完全执行它们。