65.9K
CodeProject 正在变化。 阅读更多。
Home

在 FILETABLE 中查找重复文件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.75/5 (7投票s)

2015年3月20日

CPOL

3分钟阅读

viewsIcon

15826

使用 FILETABLE 和简单的 CTE 删除内容相同但文件名不同的重复文件。

引言

当文件夹包含大量不同文件类型的文件时,查找重复文件变得非常重要。 程序员总是希望在不复杂的情况下轻松做到这一点。 可以使用 SQL Server FILESTREAMFILETABLE 来探索这一点。 本提示包含一个简单的查询,它是使用 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

这里的查询循环遍历文件夹及其子文件夹中的所有重复文件。

original files

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 函数用于避免在结果中获取重复的文件记录。

在下面的结果中,标识了重复文件,并且列表中显示了唯一文件和子文件夹。

original files

关注点

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

© . All rights reserved.