我需要一些帮助才能从表中获取记录ID。基本上我正在处理特定路径的文件夹和文件存储在数据库中的项目。
它包括一个桌面和Windows服务应用程序,我使用SDF文件进行数据库处理,并使用C#
使用ADO.NET处理数据操作这是我的文件夹表
如您所见,它的层次结构表和FolderId是一个标识列。
现在假设我的数据为
我的路径为“E:\ Books \ WCF \ Examples.pdf”。现在我如何从上表中获取“Examples.pdf”文件的FolderId。
我提出了以下方法
方法1: 通过编写递归方法,将文件夹表中与文件夹名称匹配的所有记录作为“WCF”及其完整层次结构。所以我会得到以下数据
现在在我的代码中,我将比较此层次结构列与pdf的上述文件夹路径以获取FolderId。
方法2: 从pdf路径中获取每个文件夹,我将生成看起来像这样的动态查询
select FolderId from Folders where Name='WCF' and
ParentFolderId in (select FolderId from Folders where Name='Books' and
ParentFolderId in (select FolderId from Folders where Name='E:'))
基于我的两种方法,我应该选择哪种方法。性能是一个关键因素,文件夹表可能有超过一百万条记录。随意建议任何更好的方法。
答案 0 :(得分:0)
测试数据
CREATE TABLE Table_Name50
(ID INT, Name nvarchar(100), ParentID INT)
GO
INSERT INTO Table_Name50(ID, Name,ParentID)
VALUES
( 1 ,N'E:\',NULL),
( 2, N'Books', 1),
( 3, N'History', 2),
( 4, N'Biology', 2),
( 5, N'Vidoes', 1)
GO
<强>查询强>
拉出给定ID的完整路径
DECLARE @ID INT = 3
;with CompleteData
as
(
Select ID, ParentId from Table_Name50
UNION
Select Child.ParentID Id, Parent.ParentID ParentId From Table_Name50 Child
Left Outer Join Table_Name50 Parent
on Child.ParentID = parent.ID
WHERE
parent.ParentID IS NULL
),
ChildHierarchyData(ID,ParentID, Level)
as
(
Select ID,ParentID, 0 as Level from CompleteData Where ID = @ID --<-- Your Parameter
union all
Select CompleteData.ID, CompleteData.ParentID, ChildHierarchyData.Level +1 from CompleteData
INNER Join ChildHierarchyData
on ChildHierarchyData.ParentID = CompleteData.ID
),
Concatinated(result)
as
(
Select Cast((select Cast(Name as nvarchar) + '\' [data()]
from ChildHierarchyData CD INNER JOIN Table_Name50 tbl
ON CD.ID = tbl.ID
Order By Level Desc
FOR XML Path('')) as Nvarchar(max))
)
select Left(result, len(result)-1) as Result from Concatinated
<强>结果强>
E:\\ Books\ History