查询表中所有行的分层文件夹信息

Querying hierarchical folder information for all rows in a table

提问人:user15319584 提问时间:3/4/2021 更新时间:3/4/2021 访问量:46

问:

我们有一个旧的数据库应用程序,其中包含一个表示文件夹结构的表。我的用例与这篇旧文章中的用例非常相似,只是我需要能够返回表中所有行的文件夹路径信息,该信息相当小(727 条记录)。

该帖子中给出的功能有效,我试图对其进行逆向工程以返回所有行的结果,但由于我没有得到任何结果,我显然不知所措。

我正在尝试的代码如下。是的,只是为了确认,后端是 SQL 2000。该应用程序已经被忽视了一段时间,但我们现在终于尝试将其停用,这就是我尝试获取此文件夹结构信息的原因。感谢所有帮助。谢谢。

USE MyDB
GO
DROP TABLE #FolderTemp

DECLARE @Counter INT
DECLARE @MaxId INT
DECLARE @FolderID INT
DECLARE @ParentID INT
DECLARE @FolderPath varchar(1000)
DECLARE @FolderName varchar(1000)

SELECT MYFOLDER_Id
    , MYFOLDER_ParentId
    , MYFOLDER_LogicalName 
INTO #FolderTemp FROM MYTABLE

Select @Counter = min(MYFOLDER_Id), @MaxId = max(MYFOLDER_Id)
FROM #FolderTemp
GROUP BY MYFOLDER_LogicalName

WHILE (@Counter IS NOT NULL
    AND @Counter <= @MaxId)
BEGIN


SELECT MYFOLDER_ParentID = @ParentID, MYFOLDER_LogicalName = @FolderName, @FolderPath
      FROM #FolderTemp
      WHERE MYFOLDER_Id = @FolderID
      ((
    select @FolderPath = MYFOLDER_LogicalName + '\' + @FolderPath, @ParentID = MYFOLDER_ParentID
           from #FolderTemp
           where MYFOLDER_Id = @ParentID
    ))
PRINT @FolderPath + '\' + @FolderName
    SET @Counter  = @Counter  + 1        
END
SQL 服务器-2000

评论


答:

0赞 Caius Jard 3/4/2021 #1

while 循环似乎递增了一个名为的变量,但 while 中的查询使用一个名为该变量的变量,该变量从未赋值,并且始终具有默认值 null@counter@folderid

递归查询在 sqlserver 2000 中是一项艰巨的工作。如果这是获取数据的一次性操作,那么您可能会做得比复制粘贴最深路径所需的尽可能多的左连接更糟糕,例如

SELECT t0.name, t1.name, t2.name ...
FROM t t0
  LEFT JOIN t t1 ON t1.parentid = t0.id 
  LEFT JOIN t t2 ON t2.parentid = t1.id 
...

评论

0赞 user15319584 3/5/2021
感谢您的指导。尝试左连接的建议奏效了,尽管有几条路径下降了 11 级,因此即使在排除空值后,输出也有点难以阅读。我再次尝试使用原始代码,将“@counter”替换为“@folderid”,这似乎效果更好一些,但仍然没有返回有效数据。如何设置变量以提取实际数据?任何要审查的指导或资源都会很棒。谢谢。
0赞 Caius Jard 3/5/2021
哦,我在想,作为一次性操作,您可能会将这些路径拉入文本编辑器(选择所有结果网格、复制、粘贴)并找到 Replace NULL with nothing..你还不清楚你期望什么输出,