在 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 函数用于避免在结果中获取重复的文件记录。
在下面的结果中,标识了重复文件,并且列表中显示了唯一文件和子文件夹。
关注点
处理各种文件类型的实际二进制内容有很多复杂性,并且我尝试了许多应用程序,但仍然效率不高。 通常,程序员建议在完全删除重复文件之前仔细检查。 在这种情况下,此查询将有助于查找重复文件。 希望这篇文章对大家有所帮助。 如果您能分享您的反馈,我将不胜感激。 谢谢!