/* 将检录任务、检录记录绑定到赛事秩序册场次。 适用:SQL Server,可重复执行。 依赖:20260804_AddMiniProgramCompetitionRoles.sql */ SET NOCOUNT ON; IF OBJECT_ID(N'dbo.CheckinTask', N'U') IS NULL THROW 50001, N'缺少 dbo.CheckinTask,请先执行 20260804_AddMiniProgramCompetitionRoles.sql', 1; IF OBJECT_ID(N'dbo.CheckinRecord', N'U') IS NULL THROW 50002, N'缺少 dbo.CheckinRecord,请先执行 20260804_AddMiniProgramCompetitionRoles.sql', 1; IF COL_LENGTH(N'dbo.CheckinTask', N'CurrentSessionKey') IS NULL ALTER TABLE dbo.CheckinTask ADD CurrentSessionKey NVARCHAR(64) NULL; IF COL_LENGTH(N'dbo.CheckinTask', N'CurrentSessionOrder') IS NULL ALTER TABLE dbo.CheckinTask ADD CurrentSessionOrder INT NOT NULL CONSTRAINT DF_CheckinTask_CurrentSessionOrder DEFAULT (0); IF COL_LENGTH(N'dbo.CheckinTask', N'CurrentSessionName') IS NULL ALTER TABLE dbo.CheckinTask ADD CurrentSessionName NVARCHAR(256) NULL; IF COL_LENGTH(N'dbo.CheckinTask', N'CurrentEventProjectId') IS NULL ALTER TABLE dbo.CheckinTask ADD CurrentEventProjectId BIGINT NULL; IF COL_LENGTH(N'dbo.CheckinTask', N'CurrentSessionVenue') IS NULL ALTER TABLE dbo.CheckinTask ADD CurrentSessionVenue NVARCHAR(128) NULL; IF COL_LENGTH(N'dbo.CheckinRecord', N'SessionKey') IS NULL ALTER TABLE dbo.CheckinRecord ADD SessionKey NVARCHAR(64) NULL; IF COL_LENGTH(N'dbo.CheckinRecord', N'SessionOrder') IS NULL ALTER TABLE dbo.CheckinRecord ADD SessionOrder INT NOT NULL CONSTRAINT DF_CheckinRecord_SessionOrder DEFAULT (0); GO IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.CheckinTask') AND name = N'IX_CheckinTask_Event_Session') CREATE INDEX IX_CheckinTask_Event_Session ON dbo.CheckinTask (EventId, CurrentSessionOrder, CurrentEventProjectId); IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.CheckinRecord') AND name = N'UX_CheckinRecord_Task_Round_Person_Active') DROP INDEX UX_CheckinRecord_Task_Round_Person_Active ON dbo.CheckinRecord; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.CheckinRecord') AND name = N'UX_CheckinRecord_Task_Session_Person_Active') CREATE UNIQUE INDEX UX_CheckinRecord_Task_Session_Person_Active ON dbo.CheckinRecord (TaskId, SessionKey, RegistrationPersonId) WHERE DeleteMark = 0 AND SessionKey IS NOT NULL; DECLARE @Comments TABLE ( TableName SYSNAME NOT NULL, ColumnName SYSNAME NOT NULL, [Description] NVARCHAR(4000) NOT NULL ); INSERT INTO @Comments (TableName, ColumnName, [Description]) VALUES (N'CheckinTask', N'TotalRounds', N'兼容字段:当前赛事秩序册场次总数'), (N'CheckinTask', N'CurrentRound', N'兼容字段:当前场次在整本赛事秩序册中的全局顺序'), (N'CheckinTask', N'RoundName', N'兼容字段:当前秩序册场次显示名称'), (N'CheckinTask', N'CurrentSessionKey', N'当前秩序册场次稳定标识,格式为 EP{EventProjectId}-S{项目内场次序号}'), (N'CheckinTask', N'CurrentSessionOrder', N'当前场次在整本赛事秩序册中的全局顺序,从1开始'), (N'CheckinTask', N'CurrentSessionName', N'当前秩序册场次显示名称,包含全局场次、项目和项目内场次'), (N'CheckinTask', N'CurrentEventProjectId', N'当前场次所属赛事项目ID,关联 EventProject.Id'), (N'CheckinTask', N'CurrentSessionVenue', N'当前秩序册场次包含的比赛场地名称或编号'), (N'CheckinTask', N'CurrentGroupId', N'当前秩序册场次仅含单一组别时的 EventProjectGroup.Id;跨组别场次为空'), (N'CheckinTask', N'CurrentGroupName', N'当前秩序册场次包含的组别名称,多个组别使用顿号连接'), (N'CheckinTask', N'GroupOrder', N'兼容字段:当前场次在所属项目内的场次序号'), (N'CheckinTask', N'TotalGroups', N'兼容字段:当前赛事项目在秩序册中的场次总数'), (N'CheckinTask', N'NextGroupName', N'兼容字段:秩序册中的下一个场次名称'), (N'CheckinRecord', N'Round', N'兼容字段:检录发生时的秩序册全局场次顺序'), (N'CheckinRecord', N'GroupId', N'该人员所属赛事项目组别ID,关联 EventProjectGroup.Id'), (N'CheckinRecord', N'SessionKey', N'检录发生时的秩序册场次稳定标识,与 CheckinTask.CurrentSessionKey 对应'), (N'CheckinRecord', N'SessionOrder', N'检录发生时该场次在赛事秩序册中的全局顺序'); DECLARE @TableName SYSNAME, @ColumnName SYSNAME, @Description NVARCHAR(4000), @ObjectId INT, @ColumnId INT; DECLARE CommentCursor CURSOR LOCAL FAST_FORWARD FOR SELECT TableName, ColumnName, [Description] FROM @Comments; OPEN CommentCursor; FETCH NEXT FROM CommentCursor INTO @TableName, @ColumnName, @Description; WHILE @@FETCH_STATUS = 0 BEGIN SET @ObjectId = OBJECT_ID(QUOTENAME(N'dbo') + N'.' + QUOTENAME(@TableName), N'U'); SET @ColumnId = COLUMNPROPERTY(@ObjectId, @ColumnName, 'ColumnId'); IF @ObjectId > 0 AND @ColumnId > 0 BEGIN IF EXISTS ( SELECT 1 FROM sys.extended_properties WHERE class = 1 AND major_id = @ObjectId AND minor_id = @ColumnId AND name = N'MS_Description' ) BEGIN EXEC sys.sp_updateextendedproperty @name = N'MS_Description', @value = @Description, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @TableName, @level2type = N'COLUMN', @level2name = @ColumnName; END ELSE BEGIN EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = @Description, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @TableName, @level2type = N'COLUMN', @level2name = @ColumnName; END; END; FETCH NEXT FROM CommentCursor INTO @TableName, @ColumnName, @Description; END; CLOSE CommentCursor; DEALLOCATE CommentCursor; SELECT t.name AS TableName, c.name AS ColumnName, CAST(ep.value AS NVARCHAR(4000)) AS [Description] FROM sys.extended_properties ep INNER JOIN sys.tables t ON ep.class = 1 AND ep.major_id = t.object_id INNER JOIN sys.columns c ON c.object_id = t.object_id AND c.column_id = ep.minor_id WHERE ep.name = N'MS_Description' AND t.name IN (N'CheckinTask', N'CheckinRecord') ORDER BY t.name, c.column_id;