2015-10-07 27 views
0

我有一个使用SQL Server层次结构id设置的产品类别表,我想在CMS中创建一个自动完成下拉菜单,该下拉菜单返回搜索匹配的类别,而不仅仅是显示匹配的类别名称还显示它的层次结构/路径,例如SQL Server Hierarchy ID搜索记录并在结果中包含所有相关父项

用户开始搜索“猫”,并在自动完成他们看到

  • 宠物用品>猫
  • 宠物用品>猫>猫粮
  • 宠物用品>毛虫
  • 宠物活动>狗>捕捉游戏

是否有简单的方法可以做到这一点?我发现的例子集中于选择首先选择的单个特定节点的父项,但我找不到任何用于选择多个节点并随后选择所有父项作为匹配节点的示例。

我很高兴将结果按照上述格式,一旦我从数据库中检索到它们,但它获得的数据似乎是棘手的部分。

我使用的是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 
+1

请显示您的表架构,示例数据。 – DarkKnight

回答

1

这里有一个表值函数,给定一个HIERARCHYID,将返回所有的HIERARCHYID的祖先。

alter function dbo.GetAllAncestors(@h hierarchyid, @ReturnSelf bit) 
returns table 
as return 
    select @h.GetAncestor(n.Number) as h 
    from dbo.Numbers as n 
    where n.Number < @h.GetLevel() 

    union all 

    select @h 
    where @ReturnSelf = 1 
go 

其中数字表只是一个理货表(谷歌,如果你从来没有听说过)。对于你的“乔吹”的例子,这应该工作:

SELECT t.* 
FROM dbo.HierarchyTable as h 
cross apply dbo.GetAllAncestors(h.CategoryNode, 1) as a 
join dbo.HierarchyTable as t 
    on a.h = t.CategoryNode 
WHERE h.[Name] = 'Joe Blow'; 
相关问题