Мне было поручено перенести скрипт, который пересекает иерархию и расширяет ее.Во-первых, скрипт работает очень медленно, а во-вторых, мы переходим на гораздо более контролируемый сервер, поэтому мне нужно исключить функции.Мне было интересно, может ли кто-нибудь помочь в интеграции того, что делает функция во втором утверждении, и вызвать весь сценарий внутри оператора выбора первого сценария.
Я понимаю, что разделение между ними может быть намного лучше с точки зрения производительности, однако это единственная функция, которая существует, и единственный оператор выбора, который ее использует, поэтому я бы предпочел объединить эти два, а не проходить черезпроцесс его утверждения и добавления.Во-вторых, если бы кто-нибудь мог найти более оптимальный путь для достижения этого, это было бы замечательно, и я открыт для предложений, помня, что это касается примерно 11 уровней.
Первая часть скрипта - это оператор выбора, в котором функция вызывается и, очевидно, возвращается в таблицу:
DECLARE @RootNode INT = 1
DECLARE @Level1 INT = 2
DECLARE @Level2 INT = 3
DECLARE @Level3 INT = 4
DECLARE @Level4 INT = 5
TRUNCATE TABLE [...].[Hierarchy]
--
INSERT INTO [...].[Hierarchy]
SELECT Nodes.NodeId,
NodeTypeValues.Value AS HierarchyValue,
(select NodeTypeValue from [...].[Function_GetTheParentNodesForTheSelectedNodeType] (abc.NodeId, @RootNode)) AS RootLevel,
(select NodeTypeValue from [...].[Function_GetTheParentNodesForTheSelectedNodeType] (abc.NodeId, @Level1)) AS Level1,
(select NodeTypeValue from [...].[Function_GetTheParentNodesForTheSelectedNodeType] (abc.NodeId, @Level2)) AS Level2,
(select NodeTypeValue from [...].[Function_GetTheParentNodesForTheSelectedNodeType] (abc.NodeId, @Level3)) AS Level3,
(select NodeTypeValue from [...].[Function_GetTheParentNodesForTheSelectedNodeType] (abc.NodeId, @Level4)) AS Level4
--Level 5...
--Level 6...
--Level 7...
FROM [...].[Nodes] Nodes
INNER JOIN [...].NodeTypes NodeTypes ON NodeTypes.NodeTypeId = Nodes.NodeTypeId
INNER JOIN [...].NodeTypeValues NodeTypeValues ON NodeTypeValues.NodeTypeValueId = Nodes.NodeTypeValueId
WHERE NodeTypes.HierarchyTypeId = 1
Вторая часть - это фактическая вызываемая функция,Функция предназначена для обхода и возврата табличного результата обратно в основной запрос к хранилищу:
FUNCTION [...].[Function_GetTheParentNodesForTheSelectedNodeType]
( @NodeId int,
@NodeTypeId int
)
RETURNS
@ReturnData TABLE
(
NodeTypeValue NVARCHAR(100),
NodeId INT
)
AS
BEGIN
WITH NodeSubTreesUpwards AS
(
SELECT SubRootNode.NodeId AS SubRootNodeId,
SubRootNode.*,
NULL AS ChildNodeId,
0 AS HierarchyLevel
FROM [...].[Nodes] AS SubRootNode
WHERE SubRootNode.NodeId = @NodeId
UNION ALL
SELECT NodeSubTreesUpwards.SubRootNodeId,
ParentNode.*,
Parent.ChildNodeId, (NodeSubTreesUpwards.HierarchyLevel) - 1 AS HierarchyLevel
FROM NodeSubTreesUpwards
INNER JOIN [...].[ParentChildNodes] AS Parent ON Parent.ChildNodeId = NodeSubTreesUpwards.NodeId
INNER JOIN [...].[Nodes] AS ParentNode ON ParentNode.NodeId = Parent.ParentNodeId
)
INSERT INTO @ReturnData
SELECT TOP 1 NodeTypeValues.Value, NodeSubTreesUpwards.NodeId
FROM NodeSubTreesUpwards NodeSubTreesUpwards
INNER JOIN [...].[NodeTypes] NodeType ON NodeType.NodeTypeId = n.NodeTypeId
INNER JOIN [...].[NodeTypeValues] NodeTypeValues ON NodeTypeValues.NodeTypeValueId = n.NodeTypeValueId
WHERE NodeType.NodeTypeId = @NodeTypeId
RETURN
Я действительно пытался разделить это, но изо всех сил пытался это сделать, я, скорее всего, упустил что-то глупоеили это просто просто не понимание процесса создания иерархии, я сидел на этом в течение дня или двух сейчас.Я был бы более чем счастлив использовать ту же функцию, просто не вызывая ее и скорее делая это в главном операторе выбора вместо вызываемой функции, но не уверен, что из-за рекурсии это будет проблемой?