SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO IF OBJECT_ID(N'dbo.SceneManuscriptSources', N'U') IS NULL BEGIN CREATE TABLE dbo.SceneManuscriptSources ( SceneID int NOT NULL CONSTRAINT PK_SceneManuscriptSources PRIMARY KEY, ProjectID int NOT NULL, BookID int NOT NULL, ChapterID int NOT NULL, SourceText nvarchar(max) NOT NULL, SourceWordCount int NOT NULL, SourceCharacterCount int NOT NULL, SourceStartParagraph int NULL, SourceEndParagraph int NULL, WordStartParagraphIndex int NULL, WordEndParagraphIndex int NULL, SourceKind nvarchar(80) NOT NULL CONSTRAINT DF_SceneManuscriptSources_SourceKind DEFAULT N'StructuralImport', CreatedUtc datetime2 NOT NULL CONSTRAINT DF_SceneManuscriptSources_CreatedUtc DEFAULT SYSUTCDATETIME(), UpdatedUtc datetime2 NOT NULL CONSTRAINT DF_SceneManuscriptSources_UpdatedUtc DEFAULT SYSUTCDATETIME(), CONSTRAINT FK_SceneManuscriptSources_Scenes FOREIGN KEY (SceneID) REFERENCES dbo.Scenes(SceneID), CONSTRAINT FK_SceneManuscriptSources_Projects FOREIGN KEY (ProjectID) REFERENCES dbo.Projects(ProjectID), CONSTRAINT FK_SceneManuscriptSources_Books FOREIGN KEY (BookID) REFERENCES dbo.Books(BookID), CONSTRAINT FK_SceneManuscriptSources_Chapters FOREIGN KEY (ChapterID) REFERENCES dbo.Chapters(ChapterID) ); END; GO IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_SceneManuscriptSources_BookChapter' AND object_id = OBJECT_ID(N'dbo.SceneManuscriptSources')) CREATE INDEX IX_SceneManuscriptSources_BookChapter ON dbo.SceneManuscriptSources(BookID, ChapterID, SceneID); GO CREATE OR ALTER PROCEDURE dbo.SceneManuscriptSource_Save @SceneID int, @ProjectID int, @BookID int, @ChapterID int, @SourceText nvarchar(max), @SourceWordCount int, @SourceCharacterCount int, @SourceStartParagraph int = NULL, @SourceEndParagraph int = NULL, @WordStartParagraphIndex int = NULL, @WordEndParagraphIndex int = NULL, @SourceKind nvarchar(80) = N'StructuralImport' AS BEGIN SET NOCOUNT ON; MERGE dbo.SceneManuscriptSources AS target USING (SELECT @SceneID AS SceneID) AS source ON target.SceneID = source.SceneID WHEN MATCHED THEN UPDATE SET ProjectID = @ProjectID, BookID = @BookID, ChapterID = @ChapterID, SourceText = @SourceText, SourceWordCount = @SourceWordCount, SourceCharacterCount = @SourceCharacterCount, SourceStartParagraph = @SourceStartParagraph, SourceEndParagraph = @SourceEndParagraph, WordStartParagraphIndex = @WordStartParagraphIndex, WordEndParagraphIndex = @WordEndParagraphIndex, SourceKind = @SourceKind, UpdatedUtc = SYSUTCDATETIME() WHEN NOT MATCHED THEN INSERT ( SceneID, ProjectID, BookID, ChapterID, SourceText, SourceWordCount, SourceCharacterCount, SourceStartParagraph, SourceEndParagraph, WordStartParagraphIndex, WordEndParagraphIndex, SourceKind ) VALUES ( @SceneID, @ProjectID, @BookID, @ChapterID, @SourceText, @SourceWordCount, @SourceCharacterCount, @SourceStartParagraph, @SourceEndParagraph, @WordStartParagraphIndex, @WordEndParagraphIndex, @SourceKind ); END; GO CREATE OR ALTER PROCEDURE dbo.SceneManuscriptSource_GetByScene @SceneID int AS BEGIN SET NOCOUNT ON; SELECT SceneID, ProjectID, BookID, ChapterID, SourceText, SourceWordCount, SourceCharacterCount, SourceStartParagraph, SourceEndParagraph, WordStartParagraphIndex, WordEndParagraphIndex, SourceKind, CreatedUtc, UpdatedUtc FROM dbo.SceneManuscriptSources WHERE SceneID = @SceneID; END; GO CREATE OR ALTER PROCEDURE dbo.SceneManuscriptSource_ListByChapter @ChapterID int AS BEGIN SET NOCOUNT ON; SELECT source.SceneID, source.ProjectID, source.BookID, source.ChapterID, source.SourceText, source.SourceWordCount, source.SourceCharacterCount, source.SourceStartParagraph, source.SourceEndParagraph, source.WordStartParagraphIndex, source.WordEndParagraphIndex, source.SourceKind, source.CreatedUtc, source.UpdatedUtc FROM dbo.SceneManuscriptSources source INNER JOIN dbo.Scenes scene ON scene.SceneID = source.SceneID WHERE source.ChapterID = @ChapterID AND scene.IsArchived = 0 ORDER BY scene.SortOrder, scene.SceneNumber, scene.SceneID; END; GO CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceSource_ChapterText_GetAdmin @ChapterID int AS BEGIN SET NOCOUNT ON; SELECT p.ProjectID, p.ProjectName, b.BookID, b.BookTitle, b.Subtitle AS BookSubtitle, c.ChapterID, c.ChapterNumber, c.ChapterTitle, sourceText.SourceText, sourceText.SourceWordCount, sourceText.SourceCharacterCount FROM dbo.Chapters c INNER JOIN dbo.Books b ON b.BookID = c.BookID INNER JOIN dbo.Projects p ON p.ProjectID = b.ProjectID OUTER APPLY ( SELECT STRING_AGG(CONVERT(nvarchar(max), sms.SourceText), CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10)) WITHIN GROUP (ORDER BY s.SortOrder, s.SceneNumber, s.SceneID) AS SourceText, SUM(sms.SourceWordCount) AS SourceWordCount, SUM(sms.SourceCharacterCount) AS SourceCharacterCount FROM dbo.Scenes s INNER JOIN dbo.SceneManuscriptSources sms ON sms.SceneID = s.SceneID WHERE s.ChapterID = c.ChapterID AND s.IsArchived = 0 ) sourceText WHERE c.ChapterID = @ChapterID AND c.IsArchived = 0 AND b.IsArchived = 0 AND p.IsArchived = 0; END; GO