Допустим, нам дана следующая таблица, хранящая дерево категорий:
CREATE TABLE [dbo].[Categories](
[CategoryId] [int] IDENTITY(1,1) NOT NULL,
[CategoryName] [nvarchar](250) NOT NULL,
[ParentId] [int] NULL,
[Level] [int] NOT NULL,
CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED
(CategoryId] ASC)
)
В таблице хранятся категории со ссылкой на родителя и их уровень. Уровень корня будет равен 1. Мы вводим уровень, для того, чтобы затем удобно строить дерево категорий в HTML.
Очевидно, нам потребуется какой-то путь автоматического расчета уровней для дерева категорий.
Например, это можно сделать такой вот процедурой:
CREATE PROCEDURE CatRebuildLevels
AS
BEGIN
DECLARE @CLevel int;
set @CLevel=1;
UPDATE Categories SET [Level]=0 WHERE NOT ParentId IS NULL;
UPDATE Categories SET [Level]=1 WHERE ParentId IS NULL;
WHILE (SELECT COUNT(*)
FROM Categories C
INNER JOIN Categories PC
ON PC.CategoryId=C.ParentId
WHERE PC.[Level] = @CLevel) > 0
BEGIN
UPDATE Categories
SET Categories.[Level]=@CLevel+1
WHERE CategoryId IN
(SELECT C.CategoryId
FROM Categories C
INNER JOIN Categories PC
ON C.ParentId = PC.CategoryId
WHERE
PC.[Level] = @CLevel)
set @CLevel = @CLevel+1
END
END
Общая идея - проставлять рекуррентно уровень, начиная с единицы. Каждый следующий уровень будет на 1 больше, чем предыдущий. Совсем несложно адаптировать эту процдуру для триггеров.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий