-- WMS / INTERFACE 共用数据库;先执行此脚本,再发布两个应用。 -- 幂等执行。归档存储过程使用 INSERT ... SELECT *,新增列必须在两表相同位置且类型一致。 SET XACT_ABORT ON; BEGIN TRY BEGIN TRANSACTION; IF OBJECT_ID(N'dbo.out_stockout', N'U') IS NULL OR OBJECT_ID(N'dbo.out_stockout_finish', N'U') IS NULL THROW 51000, N'缺少出库业务表或历史表,请核对目标数据库', 1; IF COL_LENGTH(N'dbo.out_stockout', N'is_expedited') IS NULL ALTER TABLE dbo.out_stockout ADD is_expedited int NULL; IF COL_LENGTH(N'dbo.out_stockout_finish', N'is_expedited') IS NULL ALTER TABLE dbo.out_stockout_finish ADD is_expedited int NULL; IF COL_LENGTH(N'dbo.out_stockout', N'delivery_point') IS NULL ALTER TABLE dbo.out_stockout ADD delivery_point nvarchar(100) NULL; IF COL_LENGTH(N'dbo.out_stockout_finish', N'delivery_point') IS NULL ALTER TABLE dbo.out_stockout_finish ADD delivery_point nvarchar(100) NULL; -- 不移动/重建现有列;只验证本次字段的归档位置及总列数,不改动旧字段映射。 IF (SELECT COUNT(*) FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.out_stockout')) <> (SELECT COUNT(*) FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.out_stockout_finish')) THROW 51001, N'业务表与历史表列数不同,已回滚;请核对归档映射', 1; IF EXISTS ( SELECT 1 FROM ( SELECT ROW_NUMBER() OVER (ORDER BY column_id) AS ordinal, name, system_type_id, max_length, precision, scale FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.out_stockout') ) a FULL JOIN ( SELECT ROW_NUMBER() OVER (ORDER BY column_id) AS ordinal, name, system_type_id, max_length, precision, scale FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.out_stockout_finish') ) h ON a.ordinal = h.ordinal WHERE (a.name IN (N'is_expedited', N'delivery_point') OR h.name IN (N'is_expedited', N'delivery_point')) AND (a.name IS NULL OR h.name IS NULL OR a.name <> h.name OR a.system_type_id <> h.system_type_id OR a.max_length <> h.max_length OR a.precision <> h.precision OR a.scale <> h.scale) ) THROW 51001, N'新增字段在业务表与历史表中的位置或类型不同,已回滚;请核对归档映射', 1; COMMIT TRANSACTION; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; THROW; END CATCH;