/* SQL Server 2012 兼容脚本(数据库兼容级别 110)。 不使用 DROP IF EXISTS、STRING_AGG、STRING_SPLIT、CREATE OR ALTER 等 SQL Server 2012 之后新增的语法; 错误重抛统一使用 RAISERROR。 */ SET XACT_ABORT ON; BEGIN TRY BEGIN TRANSACTION; DECLARE @Sql NVARCHAR(1000); /* 焊接任务单增加班组。 */ IF COL_LENGTH('dbo.HJGL_WeldTask', 'TeamGroupId') IS NULL ALTER TABLE dbo.HJGL_WeldTask ADD TeamGroupId NVARCHAR(50) NULL; /* 防腐委托改为关联任务单或热处理报告来源。 */ IF COL_LENGTH('dbo.Tw_AntiCorrosionTrust', 'WeldTaskCode') IS NULL ALTER TABLE dbo.Tw_AntiCorrosionTrust ADD WeldTaskCode NVARCHAR(200) NULL; IF COL_LENGTH('dbo.Tw_AntiCorrosionTrust', 'HotProessTrustId') IS NULL ALTER TABLE dbo.Tw_AntiCorrosionTrust ADD HotProessTrustId NVARCHAR(50) NULL; /* 新防腐委托仅使用焊接任务单或热处理委托作为来源。 旧来源列不再写入;该表尚无业务数据,无需迁移或回填旧来源。 */ IF COL_LENGTH('dbo.Tw_AntiCorrosionTrust', 'OutputMasterId') IS NOT NULL AND EXISTS ( SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID('dbo.Tw_AntiCorrosionTrust') AND name = 'OutputMasterId' AND is_nullable = 0 ) DROP INDEX UX_Tw_AntiCorrosionTrust_OutputMasterId ON SGGLDB_SHJ.dbo.Tw_AntiCorrosionTrust; BEGIN ALTER TABLE dbo.Tw_AntiCorrosionTrust ALTER COLUMN OutputMasterId NVARCHAR(50) NULL; END; IF COL_LENGTH('dbo.Tw_AntiCorrosionTrustDetail', 'IsPostWeld') IS NULL BEGIN ALTER TABLE dbo.Tw_AntiCorrosionTrustDetail ADD IsPostWeld BIT NOT NULL CONSTRAINT DF_Tw_AntiCorrosionTrustDetail_IsPostWeld DEFAULT (0); END; /* 下料检测增加坡口加工类型。 */ IF COL_LENGTH('dbo.HJGL_PreWeldCuttingCheck', 'GrooveProcessType') IS NULL ALTER TABLE dbo.HJGL_PreWeldCuttingCheck ADD GrooveProcessType NVARCHAR(100) NULL; /* 焊缝外观检测承接原组对记录中不属于组对工序的字段。 */ IF COL_LENGTH('dbo.HJGL_WeldAppearanceCheck', 'WeldReinforcement') IS NULL ALTER TABLE dbo.HJGL_WeldAppearanceCheck ADD WeldReinforcement DECIMAL(18,2) NULL; IF COL_LENGTH('dbo.HJGL_WeldAppearanceCheck', 'WeldHeight') IS NULL ALTER TABLE dbo.HJGL_WeldAppearanceCheck ADD WeldHeight DECIMAL(18,2) NULL; IF COL_LENGTH('dbo.HJGL_WeldAppearanceCheck', 'WeldWidth') IS NULL ALTER TABLE dbo.HJGL_WeldAppearanceCheck ADD WeldWidth DECIMAL(18,2) NULL; IF COL_LENGTH('dbo.HJGL_WeldAppearanceCheck', 'SurfaceDefect') IS NULL ALTER TABLE dbo.HJGL_WeldAppearanceCheck ADD SurfaceDefect NVARCHAR(500) NULL; IF COL_LENGTH('dbo.HJGL_WeldAppearanceCheck', 'PreheatTemperature') IS NULL ALTER TABLE dbo.HJGL_WeldAppearanceCheck ADD PreheatTemperature DECIMAL(18,2) NULL; IF COL_LENGTH('dbo.HJGL_WeldAppearanceCheck', 'InterpassTemperature') IS NULL ALTER TABLE dbo.HJGL_WeldAppearanceCheck ADD InterpassTemperature DECIMAL(18,2) NULL; IF COL_LENGTH('dbo.HJGL_WeldAppearanceCheck', 'CheckCode') IS NULL ALTER TABLE dbo.HJGL_WeldAppearanceCheck ADD CheckCode NVARCHAR(200) NULL; /* 焊接日报增加班组、专工两级审核留痕。 */ IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'TeamAuditMan') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD TeamAuditMan NVARCHAR(50) NULL; IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'TeamAuditDate') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD TeamAuditDate DATETIME NULL; IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'ProfessionalAuditMan') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD ProfessionalAuditMan NVARCHAR(50) NULL; IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'ProfessionalAuditDate') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD ProfessionalAuditDate DATETIME NULL; /* 焊接日报待审核阶段保存实际工艺快照,专工审核后再回写焊口。 */ IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'WeldingMethodId') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD WeldingMethodId NVARCHAR(50) NULL; IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'WeldTypeId') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD WeldTypeId NVARCHAR(50) NULL; IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'WeldingWire') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD WeldingWire NVARCHAR(50) NULL; IF COL_LENGTH('dbo.HJGL_WeldingDailyTempDetail', 'WeldingRod') IS NULL ALTER TABLE dbo.HJGL_WeldingDailyTempDetail ADD WeldingRod NVARCHAR(50) NULL; /* 历史待审核记录按焊口当前工艺值补齐,保证升级后查询和审核行为一致。 */ SET @Sql = N' UPDATE temp SET WeldingMethodId = COALESCE(temp.WeldingMethodId, joint.WeldingMethodId), WeldTypeId = COALESCE(temp.WeldTypeId, joint.WeldTypeId), WeldingWire = COALESCE(temp.WeldingWire, joint.WeldingWire), WeldingRod = COALESCE(temp.WeldingRod, joint.WeldingRod) FROM dbo.HJGL_WeldingDailyTempDetail temp INNER JOIN dbo.HJGL_WeldJoint joint ON joint.WeldJointId = temp.WeldJointId WHERE temp.WeldingMethodId IS NULL OR temp.WeldTypeId IS NULL OR temp.WeldingWire IS NULL OR temp.WeldingRod IS NULL;'; EXEC sys.sp_executesql @Sql; /* 为本次新增字段补充数据库注释。 字段已存在时更新 MS_Description,不存在注释时新增,确保升级脚本可重复执行。 */ DECLARE @ColumnComments TABLE ( TableName SYSNAME NOT NULL, ColumnName SYSNAME NOT NULL, ColumnDescription NVARCHAR(500) NOT NULL, SortIndex INT NOT NULL ); INSERT INTO @ColumnComments (TableName, ColumnName, ColumnDescription, SortIndex) SELECT N'HJGL_WeldTask', N'TeamGroupId', N'班组ID', 1 UNION ALL SELECT N'Tw_AntiCorrosionTrust', N'WeldTaskCode', N'来源焊接任务单编码', 2 UNION ALL SELECT N'Tw_AntiCorrosionTrust', N'HotProessTrustId', N'来源热处理委托ID', 3 UNION ALL SELECT N'Tw_AntiCorrosionTrustDetail', N'IsPostWeld', N'是否焊后防腐:0-否,1-是', 4 UNION ALL SELECT N'HJGL_PreWeldCuttingCheck', N'GrooveProcessType', N'坡口加工类型', 5 UNION ALL SELECT N'HJGL_WeldAppearanceCheck', N'WeldReinforcement', N'焊缝余高', 6 UNION ALL SELECT N'HJGL_WeldAppearanceCheck', N'WeldHeight', N'焊缝高度', 7 UNION ALL SELECT N'HJGL_WeldAppearanceCheck', N'WeldWidth', N'焊缝宽度', 8 UNION ALL SELECT N'HJGL_WeldAppearanceCheck', N'SurfaceDefect', N'表面缺陷', 9 UNION ALL SELECT N'HJGL_WeldAppearanceCheck', N'PreheatTemperature', N'预热温度', 10 UNION ALL SELECT N'HJGL_WeldAppearanceCheck', N'InterpassTemperature', N'层间温度', 11 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'TeamAuditMan', N'班组审核人ID', 12 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'TeamAuditDate', N'班组审核时间', 13 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'ProfessionalAuditMan', N'专工审核人ID', 14 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'ProfessionalAuditDate', N'专工审核时间', 15 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'WeldingMethodId', N'待审核焊接方法ID,专工审核后回写焊口', 16 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'WeldTypeId', N'待审核焊缝类型ID,专工审核后回写焊口', 17 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'WeldingWire', N'待审核焊丝ID,专工审核后回写焊口', 18 UNION ALL SELECT N'HJGL_WeldingDailyTempDetail', N'WeldingRod', N'待审核焊条ID,专工审核后回写焊口', 19 UNION ALL SELECT N'HJGL_WeldAppearanceCheck', N'CheckCode', N'焊缝外观检测编号,格式:FCC-单位工程名称-yyyyMMdd', 20; DECLARE @CommentTableName SYSNAME; DECLARE @CommentColumnName SYSNAME; DECLARE @ColumnDescription NVARCHAR(500); DECLARE ColumnComments CURSOR LOCAL FAST_FORWARD FOR SELECT TableName, ColumnName, ColumnDescription FROM @ColumnComments ORDER BY SortIndex; OPEN ColumnComments; FETCH NEXT FROM ColumnComments INTO @CommentTableName, @CommentColumnName, @ColumnDescription; WHILE @@FETCH_STATUS = 0 BEGIN IF COL_LENGTH(N'dbo.' + @CommentTableName, @CommentColumnName) IS NOT NULL BEGIN IF EXISTS ( SELECT 1 FROM sys.extended_properties ep INNER JOIN sys.columns c ON c.object_id = ep.major_id AND c.column_id = ep.minor_id WHERE ep.class = 1 AND ep.name = N'MS_Description' AND ep.major_id = OBJECT_ID(N'dbo.' + @CommentTableName) AND c.name = @CommentColumnName ) BEGIN EXEC sys.sp_updateextendedproperty @name = N'MS_Description', @value = @ColumnDescription, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @CommentTableName, @level2type = N'COLUMN', @level2name = @CommentColumnName; END ELSE BEGIN EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = @ColumnDescription, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @CommentTableName, @level2type = N'COLUMN', @level2name = @CommentColumnName; END; END; FETCH NEXT FROM ColumnComments INTO @CommentTableName, @CommentColumnName, @ColumnDescription; END; CLOSE ColumnComments; DEALLOCATE ColumnComments; /* 原有已审核记录直接视为两级审核完成,旧审核信息回填到专工审核。 */ UPDATE dbo.HJGL_WeldingDailyTempDetail SET AuditState = 2, ProfessionalAuditMan = COALESCE(ProfessionalAuditMan, AuditMan), ProfessionalAuditDate = COALESCE(ProfessionalAuditDate, AuditDate) WHERE AuditState = 1; /* 组对记录只保留组对工序字段。 */ IF EXISTS (SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID('dbo.HJGL_PreWeldFitupCheck') AND name = 'FK_PreWeldFitupCheck_GrooveType') ALTER TABLE dbo.HJGL_PreWeldFitupCheck DROP CONSTRAINT FK_PreWeldFitupCheck_GrooveType; DECLARE @FitupColumn SYSNAME; DECLARE @FitupIndex SYSNAME; DECLARE @DefaultConstraint SYSNAME; DECLARE @FitupColumns TABLE ( ColumnName SYSNAME NOT NULL, SortIndex INT NOT NULL ); /* 使用 SQL Server 2012 支持的 UNION ALL 初始化待删除字段,避免依赖高版本语法。 */ INSERT INTO @FitupColumns (ColumnName, SortIndex) SELECT N'GrooveTypeId', 1 UNION ALL SELECT N'GrooveProcessType', 2 UNION ALL SELECT N'GrooveAngle', 3 UNION ALL SELECT N'WeldReinforcement', 4 UNION ALL SELECT N'WeldHeight', 5 UNION ALL SELECT N'WeldWidth', 6 UNION ALL SELECT N'SurfaceDefect', 7; DECLARE FitupColumns CURSOR LOCAL FAST_FORWARD FOR SELECT ColumnName FROM @FitupColumns ORDER BY SortIndex; OPEN FitupColumns; FETCH NEXT FROM FitupColumns INTO @FitupColumn; WHILE @@FETCH_STATUS = 0 BEGIN IF COL_LENGTH('dbo.HJGL_PreWeldFitupCheck', @FitupColumn) IS NOT NULL BEGIN WHILE 1 = 1 BEGIN SET @FitupIndex = NULL; SELECT TOP (1) @FitupIndex = i.name FROM sys.indexes i INNER JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id INNER JOIN sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id WHERE i.object_id = OBJECT_ID('dbo.HJGL_PreWeldFitupCheck') AND c.name = @FitupColumn AND i.is_primary_key = 0 AND i.is_unique_constraint = 0; IF @FitupIndex IS NULL BREAK; SET @Sql = N'DROP INDEX ' + QUOTENAME(@FitupIndex) + N' ON dbo.HJGL_PreWeldFitupCheck'; EXEC sys.sp_executesql @Sql; END; SET @DefaultConstraint = NULL; SELECT @DefaultConstraint = dc.name FROM sys.default_constraints dc INNER JOIN sys.columns c ON c.object_id = dc.parent_object_id AND c.column_id = dc.parent_column_id WHERE dc.parent_object_id = OBJECT_ID('dbo.HJGL_PreWeldFitupCheck') AND c.name = @FitupColumn; IF @DefaultConstraint IS NOT NULL BEGIN SET @Sql = N'ALTER TABLE dbo.HJGL_PreWeldFitupCheck DROP CONSTRAINT ' + QUOTENAME(@DefaultConstraint); EXEC sys.sp_executesql @Sql; END; SET @Sql = N'ALTER TABLE dbo.HJGL_PreWeldFitupCheck DROP COLUMN ' + QUOTENAME(@FitupColumn); EXEC sys.sp_executesql @Sql; END; FETCH NEXT FROM FitupColumns INTO @FitupColumn; END; CLOSE FitupColumns; DEALLOCATE FitupColumns; COMMIT TRANSACTION; END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); /* SQL Server 2012 使用 RAISERROR 重新抛出原始错误。 */ RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState); END CATCH;