Files
FT363-INTERFACE/sql/20260908_order_management_fields.sql

50 lines
2.5 KiB
Transact-SQL

-- 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;