Я пытаюсь разработать систему, основанную на "Статьях". В базе данных может быть одна запись Статьи, а затем столько же данных статьи, ссылающихся на эти ArticleData.
Сейчас я пытаюсьправильно обновить PageOrder.Я хочу, чтобы числа всегда были такими же, как, например, от 1 до 15.Я не хочу, чтобы номера страниц были такими.1, 1, 3, 6, 8, 9, 10 ... Просто должно быть 1, 2, 3, 4, 5, 6, 7.
Мне удалось заполнить при добавлении новой записидля статьи, как я вставляю новую запись, а затем успешно пересчитать порядок.Проблема в том, когда я хочу изменить официальную запись.Например:
Допустим, у меня есть 5 страниц.
- Страница 1,
- Страница 2,
- Страница 3,
- Страница 4,
- Страница 5
Допустим, я хочу, чтобы Страница 3 стала Страница 5
- Страница 1,
- Страница 2,
- Страница 4,
- Страница 5,
- Страница 3
Теперь по индексированию я хочу иметь возможность переиндексировать это так, чтобы оно стало таким, каким оно должно быть.
Вопрос сейчас ... Как я могу сделать это в T-SQL?процедура (SQL Server 2005)?
ALTER PROCEDURE [dbo].[Admin_InsertOrUpdateArticle]
@Id int = null
,@ArticleId int = null
,@Header varchar(50)
,@ParentId int = null
,@ArticleType int
,@DisplayOrder int = 0
,@Content text
,@ModifiedById int
,@ModifiedBy varchar(50)
,@ModifiedDate datetime
,@Subject varchar(100)
,@NewPage int
AS
BEGIN
SET NOCOUNT ON;
UPDATE
[Article]
SET
[Header] = @Header
,[ParentId] = @ParentId
,[DisplayOrder] = @DisplayOrder
,[Type] = @ArticleType
WHERE
[Article].[Id] = @ArticleId
-- If Article does not exists then we don't have any record of even Article Data!
-- NEW RECORD!
IF(@@ROWCOUNT = 0)
BEGIN
INSERT INTO [Article]
(
[Header]
,[ParentId]
,[DisplayOrder]
,[Type]
)
VALUES
(
@Header
,@ParentId
,@DisplayOrder
,@ArticleType
);
INSERT INTO [ArticleData]
(
[ArticleId]
,[Content]
,[CreatedBy]
,[CreatedById]
,[ModifiedBy]
,[ModifiedById]
,[PostDate]
,[ModifiedDate]
,[Subject]
,[PageOrder]
)
VALUES
(
@@IDENTITY
,@Content
,@ModifiedBy
,@ModifiedById
,@ModifiedBy
,@ModifiedById
,@ModifiedDate
,@ModifiedDate
,@Subject
,1 -- First Page!!!
)
END
ELSE
BEGIN
-- We do have a Article Record, therefore we update the current page and check to see if it is a new page!
UPDATE
[ArticleData]
SET
[Content] = @Content
,[Subject] = @Subject
,[ModifiedBy] = @ModifiedBy
,[ModifiedById] = @ModifiedById
,[ModifiedDate] = @ModifiedDate
WHERE
[ArticleData].[Id] = @Id AND
[ArticleData].[ArticleId] = @ArticleId
-- Are we a new Article Data?
IF( @@ROWCOUNT = 0 )
BEGIN
-- We are lets check to see if the page we want this article for exists
IF EXISTS ( SELECT [PageOrder] FROM [ArticleData] WHERE [ArticleId] = @ArticleId AND [PageOrder] = @NewPage )
BEGIN
-- It does exists therefore we need to reorder the pages
UPDATE
[ArticleData]
SET
[PageOrder] = A.PageOrder + 1
FROM [ArticleData] A
WHERE
A.PageOrder >= @NewPage AND
[ArticleId] = @ArticleId
-- We now Insert The New data that we want at that page
INSERT INTO [ArticleData]
(
[ArticleId]
,[Content]
,[CreatedBy]
,[CreatedById]
,[ModifiedBy]
,[ModifiedById]
,[PostDate]
,[ModifiedDate]
,[Subject]
,[PageOrder]
)
VALUES
(
@ArticleId
,@Content
,@ModifiedBy
,@ModifiedById
,@ModifiedBy
,@ModifiedById
,@ModifiedDate
,@ModifiedDate
,@Subject
,@NewPage
)
END
ELSE
BEGIN
-- Since that page we want to add is not in reach we will simply add it to the very last page
INSERT INTO [ArticleData]
(
[ArticleId]
,[Content]
,[CreatedBy]
,[CreatedById]
,[ModifiedBy]
,[ModifiedById]
,[PostDate]
,[ModifiedDate]
,[Subject]
,[PageOrder]
)
VALUES
(
@ArticleId
,@Content
,@ModifiedBy
,@ModifiedById
,@ModifiedBy
,@ModifiedById
,@ModifiedDate
,@ModifiedDate
,@Subject
,(SELECT COUNT(Id)+1 FROM [ArticleData] WHERE [ArticleId] = @ArticleId) -- Add new Page as Last Record
)
END
END
ELSE
BEGIN
-- The article did update therefore lets reorder our pages based on the new page defined
-- Does this page in the article exists? IF it does lets update the pages
IF EXISTS ( SELECT [PageOrder] FROM [ArticleData] WHERE [ArticleId] = @ArticleId AND [PageOrder] = @NewPage )
BEGIN
-- Update all pages with new numbers
UPDATE
[ArticleData]
SET
[PageOrder] = A.PageOrder + 1
FROM [ArticleData] A
WHERE
A.PageOrder >= @NewPage AND
[ArticleId] = @ArticleId
-- Update THIS article data with the new page number
UPDATE
[ArticleData]
SET
[PageOrder] = @NewPage
WHERE
[ArticleData].[Id] = @Id AND
[ArticleData].[ArticleId] = @ArticleId
END
ELSE
BEGIN
-- Page doesn't exists because what we want to change it to is to far out of range for example if there are only 5 pages, then the ordering will simply set this page to the last index
UPDATE
[ArticleData]
SET
[PageOrder] = (SELECT COUNT(Id) FROM [ArticleData] WHERE [Id] = @Id AND [ArticleId] = @ArticleId)
WHERE
[ArticleData].[Id] = @Id AND
[ArticleData].[ArticleId] = @ArticleId
END
END
END
END