基于下表
Path
----------------------
area1
area1\area2
area1\area2\area3
area1\area2\area3\area4
area1\area2\area5
area1\area2\area6
area1\area7
我的存储过程的输入是areapath和no.of children(表示需要从输入isapath考虑的深度)
areapath = AREA1
孩子= 2
上面应该给出
Path
-----------
area1
area1\area2
area1\area2\area3
area1\area2\area5
area1\area2\area6
area1\area7
类似于 areapath = area2和children = 1输出应
Path
---------------
area1\area2
area1\area2\area3
area1\area2\area5
area1\area2\area6
我很困惑如何为这个写一个查询。
答案 0 :(得分:1)
嗯......看起来这是您学习开始规范化数据的部分。如果您只是将树存储为树,那将是微不足道的。
话虽这么说,你可以用一些花哨的字符串拆分和解析来解决这个问题。
您需要一个UDF,它将包含斜杠的行拆分为一个标记数组。 TSQL没有内置函数来执行此操作,也没有数组的概念,因此您需要稍微捏一下并使用临时表。
然后,只需将该数组中的[children]条目与WHERE子句中提供的[areapath]进行比较即可。
答案 1 :(得分:0)
我同意Jason的观点,但请记住,您可以使用VB.NET/C#编写分割函数,然后通过CLR导入功能将其引入SQL Server。当然,这假设您在服务器上拥有适当的授权来执行此操作。虽然SQL对很多东西都很好,但它没有像其他语言那样强大的字符串操作工具。
答案 2 :(得分:0)
我想这不是一个功课。
create table #Tt([path] varchar(255))
insert #tt values( 'area1')
insert #tt values( 'area1\area2')
insert #tt values( 'area1\area2\area3')
insert #tt values( 'area1\area2\area3\area4')
insert #tt values( 'area1\area2\area5')
insert #tt values( 'area1\area2\area6')
insert #tt values( 'area1\area7')
select * from #tt where len([path])-len(replace([path],'\','')) = 2 and [path] like 'area1\%'
drop table #tt