我有一个使用 SQL Server 层次结构 ID 设置的产品类别表,我想在 CMS 中创建一个自动完成下拉列表,该下拉列表返回匹配类别的搜索,而不仅仅是显示匹配的类别名称还显示它的层次结构/路径 例如
用户开始搜索“猫”并在他们看到的自动完成中
- 宠物用品 > 猫
- 宠物用品 > 猫 > 猫粮
- 宠物用品 > 毛毛虫
- 宠物活动 > 狗 > 抓捕游戏
有没有简单的方法可以做到这一点?我发现的示例侧重于选择首先选择的单个特定节点的父节点,但我找不到任何选择多个节点然后选择匹配节点的所有父节点的示例。
从数据库中检索结果后,我很乐意将结果按上述格式进行处理,但它获取的数据似乎是棘手的部分。
我正在使用 SQL Server 2012(不过我认为这并不重要)
这是我的架构(没什么特别的):
CREATE TABLE [dbo].[Category] (
[CategoryId] INT IDENTITY (1, 1) NOT NULL,
[PrimaryProductId] INT NULL,
[CategoryNode] [sys].[hierarchyid] NOT NULL,
[CategoryString] AS ([CategoryNode].[ToString]()) PERSISTED,
[CategoryLevel] AS ([CategoryNode].[GetLevel]()) PERSISTED,
[Title] NVARCHAR (50) NOT NULL,
[IsActive] BIT DEFAULT ((1)) NOT NULL,
CONSTRAINT [Category_CategoryId_PK] PRIMARY KEY CLUSTERED ([CategoryId] ASC),
CONSTRAINT [Category_Product_PrimaryProductId] FOREIGN KEY (PrimaryProductId) REFERENCES [dbo].[Product](ProductId),
UNIQUE NONCLUSTERED ([CategoryNode] ASC)
);
这是单行父母的示例:
DECLARE @person hierarchyid
SELECT @person = Id
FROM dbo.HierachyTable
WHERE [Name] = 'Joe Blow';
SELECT
Id, Id.ToString() AS [Path],
Id.GetLevel() AS [Level],
Id.GetAncestor(1),
Name
FROM
dbo.HierarchyTable
WHERE
@person.IsDescendantOf(Id) = 1