如何在同一存储过程中执行ALTER TABLE加字段后更新该字段值?
问题原因
SQL Server 执行单个批处理(存储过程内的所有代码默认属于同一个批处理)前,会先对所有静态SQL语句做预编译校验。你代码中的UPDATE属于静态语句,预编译阶段ALTER TABLE还未执行,LegalName列不存在,所以直接触发Invalid column name报错,整个批处理不会进入执行阶段。
你手动分开执行两条命令时属于两个独立批处理,第一个批处理执行完成后列已经创建,第二个批处理预编译时可以正常识别到列,因此运行正常。GO是客户端工具的批处理分隔符,确实不能在存储过程内部使用,拆分两个独立IF也无法解决问题,因为代码仍然属于同一个批处理,预编译校验规则不变。
解决方案
将UPDATE语句改为动态SQL执行即可,动态SQL会在运行时才触发编译,此时ALTER TABLE已经执行完成,列已存在可以正常识别:
IF COL_LENGTH('dbo.raw_customer', 'LegalName') IS NULL BEGIN ALTER TABLE [raw_customer] ADD [LegalName] varchar(255) EXEC sp_executesql N'UPDATE [raw_customer] SET [LegalName] = [Name]' END
内容的提问来源于stack exchange,提问作者Dizzy49
相关产品推荐
相关产品推荐

