Есть две таблицы, создаваемые следующим T-SQL-кодом:
IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID('dbo.t_IncItems') AND sysstat & 0xf = 3)
DROP TABLE dbo.t_IncItems
GO
IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID('dbo.t_Items') AND sysstat & 0xf = 3)
DROP TABLE dbo.t_Items
GO
CREATE TABLE dbo.t_Items (
ItemId int IDENTITY(0, 1)
CONSTRAINT PK_t_Items PRIMARY KEY CLUSTERED,
ItemNo varchar(50) NOT NULL
CONSTRAINT CH_t_Items_ItemNo CHECK
((LEN([ItemNo]) > 0) AND (LEFT([ItemNo], 1) <> ' ') AND (RIGHT([ItemNo], 1) <> ' '))
CONSTRAINT SK_t_Items UNIQUE NONCLUSTERED,
ItemName varchar(50) NOT NULL
CONSTRAINT CH_t_Items_ItemName CHECK
((LEN([ItemName]) > 0) AND (LEFT([ItemName], 1) <> ' ') AND (RIGHT([ItemName], 1) <> ' ')),
TypeId smallint NOT NULL
CONSTRAINT CK_t_Items_TypeId CHECK ([TypeId] BETWEEN 1 AND 7)
)
GO
INSERT dbo.t_Items(ItemNo, ItemName, TypeId) VALUES ('-', '-<Служебная запись>-', 1)
GO
CREATE TABLE dbo.t_IncItems (
ItemId int NOT NULL
CONSTRAINT FK_t_IncItems_ItemId FOREIGN KEY
REFERENCES dbo.t_Items (ItemId)
CONSTRAINT CK_t_IncItems_IncId CHECK ([ItemId] <> 0),
IncId int NOT NULL
CONSTRAINT FK_t_IncItems_IncId FOREIGN KEY
REFERENCES dbo.t_Items (ItemId),
Quantity int NOT NULL CONSTRAINT CK_t_IncItems_Quantity CHECK ([Quantity] > 0)
CONSTRAINT PK_t_IncItems PRIMARY KEY CLUSTERED
(IncId, ItemId)
)
GO
При выполнении заданий не использовать рекурсивные вызовы
и временные таблицы
Задание 1
==============================================================
Написать такую функцию dbo.uf_CheckCycleInc с параметрами
@ItemId int, -- код элемента
@IncId int -- код узла/сборки
возвращающую значение bit, чтобы ограничение, создаваемое оператором
ALTER TABLE dbo.t_IncItems ADD
CONSTRAINT CK_t_IncItems_Cycle CHECK
(dbo.uf_CheckCycleInc([ItemId], [IncId]) = 0)
не позволяло иметь в dbo.t_IncItems зацикленности составов
Задание 2
==============================================================
Написать функцию dbo.uf_GetItemsTreeL с параметрами
@RootId int, -- код корня дерева из dbo.t_Items.ItemId
@Count int = NULL, -- количество для корня
@Levels smallint = NULL -- число грузимых уровней за раз
возвращающую таблицу со структурой
NodeId int IDENTITY (1, 1) PRIMARY KEY, -- код узла в дереве составов
ParentId int NOT NULL, -- код узла "родителя" в дереве составов
ItemId int NOT NULL, -- код в dbo.t_Items.ItemId
ItemNo varchar(50) NOT NULL, -- Номер (обозначение)
ItemName varchar(50) NOT NULL, -- Наименование
TypeId smallint NOT NULL, -- Код типа
Quantity int NOT NULL -- Количество
содержащую вычисленное дерево составов узла @RootId (0 уровень)
не более @Levels уровней.
Если для параметра @Count выражение ISNULL(@Count, 0) < 1, то
{
{
в поле возвращаемой таблицы Quantity показывать
для "корня" дерева — 0,
для остальных — dbo.t_IncItems.Quantity у "родителя"
}
Если ISNULL(@Levels, 0) < 1, то
{ вычислять всё дерево узла @RootId, т.е без ограничения количества уровней }
}
иначе (т.б. @Count >= 1)
{
{
в поле возвращаемой таблицы Quantity показывать
для "корня" дерева — @Count,
для остальных — dbo.t_IncItems.Quantity УМНОЖЕННОЕ на Quantity "родителя"
}
{ вычислять всё дерево узла @RootId, т.е без ограничения количества уровней }
}
NodeId первого "ребёнка" должен быть на 1 больше NodeId "родителя"
"Дети" для каждого "родителя" должны быть отсотрированы по возрастанию значений
TypeId
ItemNo
т.е. иметь возрастающий NodeId.
Не вычисленный узел, но имеющий подчинённые по таблице dbo.t_IncItems,
должен иметь только одного "ребёнка" (не считаемый за вычисленный "уровень")
со следующими данными в возвращаемой таблице:
ItemId = 0
ItemNo = '. . .'
ItemName = '. . .'
TypeId = 0
Quantity = 0
P.S. Я в этом деле новичок, Объясните пожалуйста что к чему тут, и как начать их делать...