在 FILETABLE 中查找重复文件






3.75/5 (7投票s)
使用 FILETABLE 和简单的 CTE 删除内容相同但文件名不同的重复文件。
引言
当文件夹包含大量不同文件类型的文件时,查找重复文件变得非常重要。 程序员总是希望在不复杂的情况下轻松做到这一点。 可以使用 SQL Server FILESTREAM 和 FILETABLE 来探索这一点。 本提示包含一个简单的查询,它是使用 FILETABLE 识别重复文件的另一种简单方法。 这个 FILETABLE 是使用 FILESTREAM 创建的。 当谈到 FILESTREAM 时,我们不能忘记 Jacob Sebastian,他为我们提供了这个非凡的功能。 现在让我们看看这个非凡的功能如何让我们找到重复的文件。
背景
下载源中的查询包含以下内容
- 启用 FILESTREAM
- 创建 FILESTREAM数据库
- 创建 FILETABLE
- 识别重复文件
在详细分析之前,我将为您提供一个针对一般问题的简要说明,这个问题可能出现在每个人的脑海中。
为什么选择 FILESTREAM 和 FILETABLE?
FILESTREAM 帮助我们存储和管理非结构化数据,此功能允许在 NT 文件系统中存储 BLOB 数据(例如:Word 文档、图像文件、音乐和视频等)。 这个 NT 文件系统允许 SQL Server 利用 NTFS I/O 流功能,同时保持数据的事务一致性。 在引入 FILESTREAM 到编码世界之前,有两种方法;一种是 VARBINARY,它给了我们糟糕的性能,另一种是将非结构化数据存储在磁盘文件中,即使这种方法提供了良好的性能,但没有数据的事务一致性。FILESTREAM 解决了早期这两种方法的这两个问题。
并且这种非结构化数据以结构化的方式呈现,这被称为 FILETABLE。
这里的查询循环遍历文件夹及其子文件夹中的所有重复文件。

Using the Code
识别重复文件
在下面的代码中,我使用了通用表表达式 (CTE),它被称为临时表,并且总是使用 'WITH' 子句定义。一个查询中可以有多个 CTE。在这里,我使用了两个 CTE 来识别文件夹中的重复文件。
第一个 CTE 包含两个内置的 SQL 排名函数
- ROW_NUMBER
- RANK
ROW_NUMBER 被分配为唯一的增量序列号。 对于具有重复值的行,任意分配数字。
RANK 也被分配为唯一的数字。 对于具有重复值的行,分配相同的数值,并且每个表列中出现的重复项的编号序列可能会跳过(数字之间的间隙)。
    With CTE
    as
    (        
        SELECT 
	    ROW_NUMBER() over  (order by [file_stream]) as File_Number
	    , RANK() over  (order by [file_stream]) as Find_Dupe
	    ,[name]
	    ,[file_stream]
	    FROM [dbo].[FileTableTb]         
    )
    , [unique_pull]
    as(        
        SELECT MIN(File_Number) as Unique_File from CTE
	    group by Find_Dupe        
    )
	SELECT CTE.name from CTE join [unique_pull]
	on CTE.File_Number=unique_pull.Unique_File
这里的解决方案公式是提取行号和排名不相等的记录,从而找到重复文件。 第二个 CTE 中的 MIN 数学 SQL 函数用于避免在结果中获取重复的文件记录。
在下面的结果中,标识了重复文件,并且列表中显示了唯一文件和子文件夹。

关注点
处理各种文件类型的实际二进制内容有很多复杂性,并且我尝试了许多应用程序,但仍然效率不高。 通常,程序员建议在完全删除重复文件之前仔细检查。 在这种情况下,此查询将有助于查找重复文件。 希望这篇文章对大家有所帮助。 如果您能分享您的反馈,我将不胜感激。 谢谢!

