PlotDirector/PlotLine/Sql/165_Phase26A_PovAndCharacterIdentityFoundation.sql

551 lines
23 KiB
Transact-SQL

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF COL_LENGTH(N'dbo.Chapters', N'POVSource') IS NULL
ALTER TABLE dbo.Chapters ADD POVSource nvarchar(40) NULL;
GO
IF COL_LENGTH(N'dbo.Chapters', N'POVConfidence') IS NULL
ALTER TABLE dbo.Chapters ADD POVConfidence decimal(5,2) NULL;
GO
IF COL_LENGTH(N'dbo.Chapters', N'POVEvidence') IS NULL
ALTER TABLE dbo.Chapters ADD POVEvidence nvarchar(500) NULL;
GO
IF COL_LENGTH(N'dbo.Chapters', N'POVSuggestedName') IS NULL
ALTER TABLE dbo.Chapters ADD POVSuggestedName nvarchar(200) NULL;
GO
IF COL_LENGTH(N'dbo.Scenes', N'POVSource') IS NULL
ALTER TABLE dbo.Scenes ADD POVSource nvarchar(40) NULL;
GO
IF COL_LENGTH(N'dbo.Scenes', N'POVConfidence') IS NULL
ALTER TABLE dbo.Scenes ADD POVConfidence decimal(5,2) NULL;
GO
IF COL_LENGTH(N'dbo.Scenes', N'POVEvidence') IS NULL
ALTER TABLE dbo.Scenes ADD POVEvidence nvarchar(500) NULL;
GO
IF COL_LENGTH(N'dbo.Scenes', N'POVSuggestedName') IS NULL
ALTER TABLE dbo.Scenes ADD POVSuggestedName nvarchar(200) NULL;
GO
UPDATE dbo.Chapters
SET POVSource = N'Legacy'
WHERE POVCharacterID IS NOT NULL
AND POVSource IS NULL;
GO
UPDATE dbo.Scenes
SET POVSource = N'Legacy'
WHERE POVCharacterID IS NOT NULL
AND POVSource IS NULL;
GO
CREATE OR ALTER PROCEDURE dbo.Chapter_ListByBook
@BookID int
AS
BEGIN
SET NOCOUNT ON;
SELECT c.ChapterID, c.BookID, c.ChapterNumber, c.ChapterTitle, c.POVCharacterID,
pov.CharacterName AS POVCharacterName, c.POVSource, c.POVConfidence, c.POVEvidence, c.POVSuggestedName,
c.Summary, c.ChapterPurposeID, cpt.PurposeName AS ChapterPurposeName,
c.SortOrder, c.RevisionStatusID, rs.StatusName AS RevisionStatusName,
c.CreatedDate, c.UpdatedDate, c.IsArchived, c.IsLinkedToManuscript,
c.ManuscriptDocumentID, c.ExternalReference, c.LinkedUtc
FROM dbo.Chapters c
INNER JOIN dbo.RevisionStatuses rs ON rs.RevisionStatusID = c.RevisionStatusID
LEFT JOIN dbo.ChapterPurposeTypes cpt ON cpt.ChapterPurposeID = c.ChapterPurposeID
LEFT JOIN dbo.Characters pov ON pov.CharacterID = c.POVCharacterID
WHERE c.BookID = @BookID AND c.IsArchived = 0
ORDER BY c.SortOrder, c.ChapterNumber;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Chapter_Get
@ChapterID int
AS
BEGIN
SET NOCOUNT ON;
SELECT c.ChapterID, c.BookID, c.ChapterNumber, c.ChapterTitle, c.POVCharacterID,
pov.CharacterName AS POVCharacterName, c.POVSource, c.POVConfidence, c.POVEvidence, c.POVSuggestedName,
c.Summary, c.ChapterPurposeID, cpt.PurposeName AS ChapterPurposeName,
c.SortOrder, c.RevisionStatusID, rs.StatusName AS RevisionStatusName,
c.CreatedDate, c.UpdatedDate, c.IsArchived, c.IsLinkedToManuscript,
c.ManuscriptDocumentID, c.ExternalReference, c.LinkedUtc
FROM dbo.Chapters c
INNER JOIN dbo.RevisionStatuses rs ON rs.RevisionStatusID = c.RevisionStatusID
LEFT JOIN dbo.ChapterPurposeTypes cpt ON cpt.ChapterPurposeID = c.ChapterPurposeID
LEFT JOIN dbo.Characters pov ON pov.CharacterID = c.POVCharacterID
WHERE c.ChapterID = @ChapterID AND c.IsArchived = 0;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Scene_ListByChapter
@ChapterID int
AS
BEGIN
SET NOCOUNT ON;
SELECT s.SceneID, s.ChapterID, s.SceneNumber, s.SceneTitle, s.Summary, s.StructuralSummary,
s.POVCharacterID, pov.CharacterName AS POVCharacterName, s.POVSource, s.POVConfidence, s.POVEvidence, s.POVSuggestedName,
s.PrimaryLocationID, s.FloorPlanID, s.InitialFloorPlanFloorID, s.SortOrder,
s.TimeModeID, tm.TimeModeName, s.StartDateTime, s.EndDateTime, s.DurationAmount,
s.DurationUnitID, du.DurationUnitName, s.RelativeTimeText, s.TimeConfidenceID,
tc.TimeConfidenceName, s.ScenePurposeNotes, s.SceneOutcomeNotes, s.RevisionStatusID,
rs.StatusName AS RevisionStatusName, s.CreatedDate, s.UpdatedDate, s.IsArchived,
s.ArchivedDate, s.ArchivedReason, s.IsLinkedToManuscript, s.ManuscriptDocumentID,
s.ExternalReference, s.LinkedUtc, s.ImportSource, s.ImportRunID,
s.SourceStartParagraph, s.SourceEndParagraph
FROM dbo.Scenes s
INNER JOIN dbo.TimeModes tm ON tm.TimeModeID = s.TimeModeID
LEFT JOIN dbo.DurationUnits du ON du.DurationUnitID = s.DurationUnitID
INNER JOIN dbo.TimeConfidences tc ON tc.TimeConfidenceID = s.TimeConfidenceID
INNER JOIN dbo.RevisionStatuses rs ON rs.RevisionStatusID = s.RevisionStatusID
LEFT JOIN dbo.Characters pov ON pov.CharacterID = s.POVCharacterID
WHERE s.ChapterID = @ChapterID AND s.IsArchived = 0
ORDER BY s.SortOrder, s.SceneNumber, s.SceneTitle;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Scene_Get
@SceneID int
AS
BEGIN
SET NOCOUNT ON;
EXEC dbo.SceneMetric_EnsureDefaults @SceneID;
SELECT s.SceneID, s.ChapterID, s.SceneNumber, s.SceneTitle, s.SceneTitleSource, s.Summary, s.StructuralSummary,
s.POVCharacterID, pov.CharacterName AS POVCharacterName, s.POVSource, s.POVConfidence, s.POVEvidence, s.POVSuggestedName,
s.PrimaryLocationID, s.FloorPlanID, s.InitialFloorPlanFloorID,
location.LocationName AS PrimaryLocationName, location.LocationPath AS PrimaryLocationPath,
s.SortOrder, s.TimeModeID, tm.TimeModeName, s.StartDateTime, s.EndDateTime, s.DurationAmount, s.DurationUnitID,
du.DurationUnitName, s.RelativeTimeText, s.TimeConfidenceID, tc.TimeConfidenceName, s.ScenePurposeNotes,
s.SceneOutcomeNotes, s.RevisionStatusID, rs.StatusName AS RevisionStatusName, s.CreatedDate, s.UpdatedDate, s.IsArchived,
s.ArchivedDate, s.ArchivedReason, s.IsLinkedToManuscript, s.ManuscriptDocumentID, s.ExternalReference, s.LinkedUtc,
s.ImportSource, s.ImportRunID, s.SourceStartParagraph, s.SourceEndParagraph
FROM dbo.Scenes s
INNER JOIN dbo.TimeModes tm ON tm.TimeModeID = s.TimeModeID
INNER JOIN dbo.TimeConfidences tc ON tc.TimeConfidenceID = s.TimeConfidenceID
INNER JOIN dbo.RevisionStatuses rs ON rs.RevisionStatusID = s.RevisionStatusID
LEFT JOIN dbo.DurationUnits du ON du.DurationUnitID = s.DurationUnitID
LEFT JOIN dbo.LocationPaths location ON location.LocationID = s.PrimaryLocationID
LEFT JOIN dbo.Characters pov ON pov.CharacterID = s.POVCharacterID
WHERE s.SceneID = @SceneID AND s.IsArchived = 0;
SELECT ScenePurposeTypeID FROM dbo.ScenePurposes WHERE SceneID = @SceneID;
EXEC dbo.SceneMetric_ListByScene @SceneID;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Chapter_Save
@ChapterID int = NULL,
@BookID int,
@ChapterNumber decimal(9,2),
@ChapterTitle nvarchar(200),
@Summary nvarchar(max) = NULL,
@ChapterPurposeID int = NULL,
@RevisionStatusID int,
@POVCharacterID int = NULL
AS
BEGIN
SET NOCOUNT ON;
IF @POVCharacterID IS NOT NULL
AND NOT EXISTS
(
SELECT 1
FROM dbo.Characters ch
INNER JOIN dbo.Books b ON b.ProjectID = ch.ProjectID
WHERE ch.CharacterID = @POVCharacterID
AND b.BookID = @BookID
AND ch.IsArchived = 0
)
SET @POVCharacterID = NULL;
IF @ChapterID IS NULL OR @ChapterID = 0
BEGIN
DECLARE @NextChapterOrder int = ISNULL((SELECT MAX(SortOrder) FROM dbo.Chapters WHERE BookID = @BookID), 0) + 10;
INSERT dbo.Chapters (BookID, ChapterNumber, ChapterTitle, POVCharacterID, POVSource, Summary, ChapterPurposeID, SortOrder, RevisionStatusID)
VALUES (@BookID, @ChapterNumber, @ChapterTitle, @POVCharacterID, CASE WHEN @POVCharacterID IS NULL THEN NULL ELSE N'Author' END, @Summary, @ChapterPurposeID, @NextChapterOrder, @RevisionStatusID);
SELECT CAST(SCOPE_IDENTITY() AS int) AS ChapterID;
RETURN;
END;
UPDATE dbo.Chapters
SET ChapterNumber = @ChapterNumber,
ChapterTitle = @ChapterTitle,
POVCharacterID = @POVCharacterID,
POVSource = CASE
WHEN ISNULL(POVCharacterID, 0) <> ISNULL(@POVCharacterID, 0) THEN CASE WHEN @POVCharacterID IS NULL THEN NULL ELSE N'Author' END
ELSE POVSource
END,
Summary = @Summary,
ChapterPurposeID = @ChapterPurposeID,
RevisionStatusID = @RevisionStatusID,
UpdatedDate = SYSUTCDATETIME()
WHERE ChapterID = @ChapterID;
SELECT @ChapterID AS ChapterID;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Chapter_UpdatePovCharacter
@ChapterID int,
@POVCharacterID int = NULL,
@POVSource nvarchar(40) = N'Author',
@POVConfidence decimal(5,2) = NULL,
@POVEvidence nvarchar(500) = NULL,
@POVSuggestedName nvarchar(200) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @BookID int, @ProjectID int;
SELECT @BookID = c.BookID, @ProjectID = b.ProjectID
FROM dbo.Chapters c
INNER JOIN dbo.Books b ON b.BookID = c.BookID
WHERE c.ChapterID = @ChapterID;
IF @BookID IS NULL
THROW 51000, 'Chapter could not be found.', 1;
IF @POVCharacterID IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM dbo.Characters WHERE CharacterID = @POVCharacterID AND ProjectID = @ProjectID AND IsArchived = 0)
THROW 51000, 'POV character does not belong to this project.', 1;
UPDATE dbo.Chapters
SET POVCharacterID = @POVCharacterID,
POVSource = CASE WHEN @POVCharacterID IS NULL AND NULLIF(@POVSuggestedName, N'') IS NULL THEN NULL ELSE @POVSource END,
POVConfidence = @POVConfidence,
POVEvidence = NULLIF(LTRIM(RTRIM(@POVEvidence)), N''),
POVSuggestedName = NULLIF(LTRIM(RTRIM(@POVSuggestedName)), N''),
UpdatedDate = SYSUTCDATETIME()
WHERE ChapterID = @ChapterID;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Scene_Save
@SceneID int = NULL, @ChapterID int, @SceneNumber decimal(10,2), @SceneTitle nvarchar(200), @Summary nvarchar(max) = NULL,
@TimeModeID int, @StartDateTime datetime2 = NULL, @EndDateTime datetime2 = NULL, @DurationAmount decimal(10,2) = NULL,
@DurationUnitID int = NULL, @RelativeTimeText nvarchar(200) = NULL, @TimeConfidenceID int,
@ScenePurposeNotes nvarchar(max) = NULL, @SceneOutcomeNotes nvarchar(max) = NULL, @RevisionStatusID int,
@PrimaryLocationID int = NULL, @FloorPlanID int = NULL, @InitialFloorPlanFloorID int = NULL,
@POVCharacterID int = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ProjectID int;
SELECT @ProjectID = b.ProjectID
FROM dbo.Chapters c
INNER JOIN dbo.Books b ON b.BookID = c.BookID
WHERE c.ChapterID = @ChapterID;
IF @POVCharacterID IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM dbo.Characters WHERE CharacterID = @POVCharacterID AND ProjectID = @ProjectID AND IsArchived = 0)
SET @POVCharacterID = NULL;
DECLARE @NextSortOrder int;
DECLARE @CleanSceneTitle nvarchar(200) = ISNULL(LEFT(LTRIM(RTRIM(@SceneTitle)), 200), N'');
IF @SceneID IS NULL OR @SceneID = 0
BEGIN
SELECT @NextSortOrder = ISNULL(MAX(SortOrder), 0) + 10 FROM dbo.Scenes WHERE ChapterID = @ChapterID;
INSERT dbo.Scenes (ChapterID, SceneNumber, SceneTitle, SceneTitleSource, Summary, POVCharacterID, POVSource, SortOrder, TimeModeID, StartDateTime, EndDateTime,
DurationAmount, DurationUnitID, RelativeTimeText, TimeConfidenceID, ScenePurposeNotes, SceneOutcomeNotes,
RevisionStatusID, PrimaryLocationID, FloorPlanID, InitialFloorPlanFloorID)
VALUES (@ChapterID, @SceneNumber, @CleanSceneTitle, CASE WHEN NULLIF(@CleanSceneTitle, N'') IS NULL THEN NULL ELSE N'Author' END, @Summary, @POVCharacterID, CASE WHEN @POVCharacterID IS NULL THEN NULL ELSE N'Author' END, @NextSortOrder, @TimeModeID, @StartDateTime, @EndDateTime,
@DurationAmount, @DurationUnitID, @RelativeTimeText, @TimeConfidenceID, @ScenePurposeNotes, @SceneOutcomeNotes,
@RevisionStatusID, @PrimaryLocationID, @FloorPlanID, @InitialFloorPlanFloorID);
SET @SceneID = CAST(SCOPE_IDENTITY() AS int);
END
ELSE
BEGIN
UPDATE dbo.Scenes
SET SceneNumber = @SceneNumber,
SceneTitle = @CleanSceneTitle,
SceneTitleSource = CASE
WHEN ISNULL(SceneTitle, N'') <> @CleanSceneTitle THEN CASE WHEN NULLIF(@CleanSceneTitle, N'') IS NULL THEN NULL ELSE N'Author' END
ELSE SceneTitleSource
END,
Summary = @Summary,
POVCharacterID = @POVCharacterID,
POVSource = CASE
WHEN ISNULL(POVCharacterID, 0) <> ISNULL(@POVCharacterID, 0) THEN CASE WHEN @POVCharacterID IS NULL THEN NULL ELSE N'Author' END
ELSE POVSource
END,
TimeModeID = @TimeModeID,
StartDateTime = @StartDateTime,
EndDateTime = @EndDateTime,
DurationAmount = @DurationAmount,
DurationUnitID = @DurationUnitID,
RelativeTimeText = @RelativeTimeText,
TimeConfidenceID = @TimeConfidenceID,
ScenePurposeNotes = @ScenePurposeNotes,
SceneOutcomeNotes = @SceneOutcomeNotes,
RevisionStatusID = @RevisionStatusID,
PrimaryLocationID = @PrimaryLocationID,
FloorPlanID = @FloorPlanID,
InitialFloorPlanFloorID = @InitialFloorPlanFloorID,
UpdatedDate = SYSUTCDATETIME()
WHERE SceneID = @SceneID;
END
SELECT @SceneID;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Scene_UpdatePovCharacter
@SceneID int,
@POVCharacterID int = NULL,
@POVSource nvarchar(40) = N'Author',
@POVConfidence decimal(5,2) = NULL,
@POVEvidence nvarchar(500) = NULL,
@POVSuggestedName nvarchar(200) = NULL,
@OverwriteAuthor bit = 0
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ProjectID int, @ExistingSource nvarchar(40);
SELECT @ProjectID = b.ProjectID, @ExistingSource = s.POVSource
FROM dbo.Scenes s
INNER JOIN dbo.Chapters c ON c.ChapterID = s.ChapterID
INNER JOIN dbo.Books b ON b.BookID = c.BookID
WHERE s.SceneID = @SceneID;
IF @ProjectID IS NULL
THROW 51000, 'Scene could not be found.', 1;
IF @POVCharacterID IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM dbo.Characters WHERE CharacterID = @POVCharacterID AND ProjectID = @ProjectID AND IsArchived = 0)
THROW 51000, 'POV character does not belong to this project.', 1;
IF @ExistingSource = N'Author' AND ISNULL(@POVSource, N'') <> N'Author' AND @OverwriteAuthor = 0
RETURN;
UPDATE dbo.Scenes
SET POVCharacterID = @POVCharacterID,
POVSource = CASE WHEN @POVCharacterID IS NULL AND NULLIF(@POVSuggestedName, N'') IS NULL THEN NULL ELSE @POVSource END,
POVConfidence = @POVConfidence,
POVEvidence = NULLIF(LTRIM(RTRIM(@POVEvidence)), N''),
POVSuggestedName = NULLIF(LTRIM(RTRIM(@POVSuggestedName)), N''),
UpdatedDate = SYSUTCDATETIME()
WHERE SceneID = @SceneID;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Chapter_SetScenesPov
@ChapterID int,
@POVCharacterID int = NULL,
@OverwriteAuthor bit = 0
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ProjectID int;
SELECT @ProjectID = b.ProjectID
FROM dbo.Chapters c
INNER JOIN dbo.Books b ON b.BookID = c.BookID
WHERE c.ChapterID = @ChapterID;
IF @ProjectID IS NULL
THROW 51000, 'Chapter could not be found.', 1;
IF @POVCharacterID IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM dbo.Characters WHERE CharacterID = @POVCharacterID AND ProjectID = @ProjectID AND IsArchived = 0)
THROW 51000, 'POV character does not belong to this project.', 1;
UPDATE dbo.Scenes
SET POVCharacterID = @POVCharacterID,
POVSource = CASE WHEN @POVCharacterID IS NULL THEN NULL ELSE N'Author' END,
POVConfidence = NULL,
POVEvidence = NULL,
POVSuggestedName = NULL,
UpdatedDate = SYSUTCDATETIME()
WHERE ChapterID = @ChapterID
AND IsArchived = 0
AND (@OverwriteAuthor = 1 OR ISNULL(POVSource, N'') <> N'Author');
SELECT @@ROWCOUNT AS ScenesUpdated;
END;
GO
CREATE OR ALTER PROCEDURE dbo.Character_Merge
@SourceCharacterID int,
@TargetCharacterID int,
@UserID int = NULL
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF @SourceCharacterID IS NULL OR @TargetCharacterID IS NULL OR @SourceCharacterID = @TargetCharacterID
THROW 51000, 'Choose two different characters to merge.', 1;
DECLARE @ProjectID int, @SourceName nvarchar(400), @TargetName nvarchar(400), @Now datetime2 = SYSUTCDATETIME();
SELECT @ProjectID = ProjectID, @SourceName = CharacterName FROM dbo.Characters WHERE CharacterID = @SourceCharacterID AND IsArchived = 0;
SELECT @TargetName = CharacterName FROM dbo.Characters WHERE CharacterID = @TargetCharacterID AND IsArchived = 0;
IF @ProjectID IS NULL OR @TargetName IS NULL
THROW 51000, 'Both characters must exist and be active before they can be merged.', 1;
IF NOT EXISTS (SELECT 1 FROM dbo.Characters WHERE CharacterID = @TargetCharacterID AND ProjectID = @ProjectID)
THROW 51000, 'Characters must belong to the same project before they can be merged.', 1;
BEGIN TRANSACTION;
INSERT dbo.CharacterAliases (CharacterID, Alias, SortOrder)
SELECT @TargetCharacterID, AliasValue, ISNULL((SELECT MAX(SortOrder) FROM dbo.CharacterAliases WHERE CharacterID = @TargetCharacterID), 0) + ROW_NUMBER() OVER (ORDER BY AliasValue) * 10
FROM
(
SELECT LTRIM(RTRIM(@SourceName)) AS AliasValue
UNION
SELECT LTRIM(RTRIM(ShortName)) FROM dbo.Characters WHERE CharacterID = @SourceCharacterID
UNION
SELECT LTRIM(RTRIM(Alias)) FROM dbo.CharacterAliases WHERE CharacterID = @SourceCharacterID
) aliases
WHERE NULLIF(AliasValue, N'') IS NOT NULL
AND AliasValue <> @TargetName
AND NOT EXISTS
(
SELECT 1 FROM dbo.CharacterAliases existing
WHERE existing.CharacterID = @TargetCharacterID
AND UPPER(LTRIM(RTRIM(existing.Alias))) = UPPER(AliasValue)
);
UPDATE dbo.Chapters SET POVCharacterID = @TargetCharacterID, UpdatedDate = @Now WHERE POVCharacterID = @SourceCharacterID;
UPDATE dbo.Scenes SET POVCharacterID = @TargetCharacterID, UpdatedDate = @Now WHERE POVCharacterID = @SourceCharacterID;
DELETE sourceRows
FROM dbo.SceneCharacters sourceRows
WHERE sourceRows.CharacterID = @SourceCharacterID
AND EXISTS
(
SELECT 1 FROM dbo.SceneCharacters targetRows
WHERE targetRows.SceneID = sourceRows.SceneID
AND targetRows.CharacterID = @TargetCharacterID
);
UPDATE dbo.SceneCharacters SET CharacterID = @TargetCharacterID, UpdatedDate = @Now WHERE CharacterID = @SourceCharacterID;
DELETE sourceRows
FROM dbo.SceneCharacterSuggestions sourceRows
WHERE sourceRows.CharacterID = @SourceCharacterID
AND EXISTS
(
SELECT 1 FROM dbo.SceneCharacterSuggestions targetRows
WHERE targetRows.SceneID = sourceRows.SceneID
AND targetRows.CharacterID = @TargetCharacterID
AND targetRows.Status = sourceRows.Status
);
UPDATE dbo.SceneCharacterSuggestions SET CharacterID = @TargetCharacterID WHERE CharacterID = @SourceCharacterID;
DELETE sourceRows
FROM dbo.SceneFloorPlanOccupancy sourceRows
WHERE sourceRows.CharacterID = @SourceCharacterID
AND EXISTS
(
SELECT 1 FROM dbo.SceneFloorPlanOccupancy targetRows
WHERE targetRows.SceneID = sourceRows.SceneID
AND targetRows.CharacterID = @TargetCharacterID
);
UPDATE dbo.SceneFloorPlanOccupancy SET CharacterID = @TargetCharacterID, ModifiedDate = @Now WHERE CharacterID = @SourceCharacterID;
UPDATE dbo.AssetCustodyEventCharacters SET CharacterID = @TargetCharacterID WHERE CharacterID = @SourceCharacterID;
UPDATE dbo.CharacterAttributeEvents SET CharacterID = @TargetCharacterID, UpdatedDate = @Now WHERE CharacterID = @SourceCharacterID;
UPDATE dbo.CharacterKnowledge SET CharacterID = @TargetCharacterID, UpdatedDate = @Now WHERE CharacterID = @SourceCharacterID;
UPDATE dbo.CharacterImages SET CharacterID = @TargetCharacterID WHERE CharacterID = @SourceCharacterID;
UPDATE dbo.ContinuityWarningAcknowledgements
SET CharacterID = @TargetCharacterID
WHERE CharacterID = @SourceCharacterID;
UPDATE dbo.OnboardingManuscriptBuildCharacterMap SET CharacterID = @TargetCharacterID WHERE CharacterID = @SourceCharacterID;
DECLARE relationship_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT CharacterRelationshipID,
CASE WHEN CharacterAID = @SourceCharacterID THEN @TargetCharacterID ELSE CharacterAID END AS NewAID,
CASE WHEN CharacterBID = @SourceCharacterID THEN @TargetCharacterID ELSE CharacterBID END AS NewBID
FROM dbo.CharacterRelationships
WHERE IsArchived = 0
AND (CharacterAID = @SourceCharacterID OR CharacterBID = @SourceCharacterID);
DECLARE @RelationshipID int, @NewAID int, @NewBID int, @ExistingRelationshipID int;
OPEN relationship_cursor;
FETCH NEXT FROM relationship_cursor INTO @RelationshipID, @NewAID, @NewBID;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @NewAID = @NewBID
BEGIN
UPDATE dbo.CharacterRelationships
SET IsArchived = 1,
ArchivedDate = @Now,
ArchivedReason = N'Archived during character merge to avoid a self-relationship.',
UpdatedDate = @Now,
ModifiedByUserID = @UserID,
ModifiedDateUTC = @Now
WHERE CharacterRelationshipID = @RelationshipID;
END
ELSE
BEGIN
SELECT TOP (1) @ExistingRelationshipID = CharacterRelationshipID
FROM dbo.CharacterRelationships
WHERE ProjectID = @ProjectID
AND IsArchived = 0
AND CharacterRelationshipID <> @RelationshipID
AND ((CharacterAID = @NewAID AND CharacterBID = @NewBID) OR (CharacterAID = @NewBID AND CharacterBID = @NewAID))
ORDER BY CharacterRelationshipID;
IF @ExistingRelationshipID IS NOT NULL
BEGIN
UPDATE dbo.RelationshipEvents
SET CharacterRelationshipID = @ExistingRelationshipID,
UpdatedDate = @Now,
ModifiedByUserID = @UserID,
ModifiedDateUTC = @Now
WHERE CharacterRelationshipID = @RelationshipID;
UPDATE dbo.CharacterRelationships
SET IsArchived = 1,
ArchivedDate = @Now,
ArchivedReason = N'Merged into another relationship during character merge.',
UpdatedDate = @Now,
ModifiedByUserID = @UserID,
ModifiedDateUTC = @Now
WHERE CharacterRelationshipID = @RelationshipID;
END
ELSE
BEGIN
UPDATE dbo.CharacterRelationships
SET CharacterAID = @NewAID,
CharacterBID = @NewBID,
UpdatedDate = @Now,
ModifiedByUserID = @UserID,
ModifiedDateUTC = @Now
WHERE CharacterRelationshipID = @RelationshipID;
END
END
SET @ExistingRelationshipID = NULL;
FETCH NEXT FROM relationship_cursor INTO @RelationshipID, @NewAID, @NewBID;
END
CLOSE relationship_cursor;
DEALLOCATE relationship_cursor;
UPDATE dbo.Characters
SET IsArchived = 1,
ArchivedDate = @Now,
ArchivedReason = CONCAT(N'Merged into ', @TargetName, N' (CharacterID ', @TargetCharacterID, N').'),
UpdatedDate = @Now,
ModifiedByUserID = @UserID,
ModifiedDateUTC = @Now
WHERE CharacterID = @SourceCharacterID;
COMMIT TRANSACTION;
SELECT @TargetCharacterID AS TargetCharacterID,
@SourceCharacterID AS SourceCharacterID,
@SourceName AS SourceCharacterName,
@TargetName AS TargetCharacterName;
END;
GO