查找二进制重复记录SQL Server 2008(数据类型图像)

时间:2011-05-18 22:26:22

标签: sql sql-server sql-server-2008

我继承了一个数据库,其中包含一个充满SQL数据类型Image的表(300gb)。我理解这个数据类型是折旧的。

作为例行清理,我想从符合某些条件的表中删除所有重复的Image

如何有效地使用SQL比较二进制数据? =等于运算符是否足够?

以下是一个场景:

Table 'Paperwork'
  int ID
  int EmployeeID
  int AnotherID
  int AnotherFKID
  image Attachment

我想找到AttachmentEmployeeIDAnotherIDAnotherFKID相同的所有行。它需要在对数据库影响最小的情况下完成,因为有超过1,116,313行。

修改

SQL Server Image数据类型不支持LIKE或通常的比较运算符。

修改

感谢@Martin,他建议将Image转换为varbinary。我已添加到此以使用Hashbytes获取MD5校验和

HASHBYTES('MD5',CAST(cast([Attachment] as varbinary(max))as varbinary)) AS AttachmentMD5

1 个答案:

答案 0 :(得分:3)

杰里米,

任何一个脚本中的所有内容都会在读入300g时终止缓冲区缓存。把工作分成几个任务。

任务1

  • 使用ID创建一个表,并使用分组显示三个int列的副本

表格示例

    TableID  PaperWorkID GroupID
       1        14          1
       2        15          1
       3        21          2
       4        55          2

现在我们知道PaperWorkID的14和15共享三个int列,因为它们属于同一组。

任务2

  • 在表格中添加一列(bigint),并根据表格中的DATALENGTH使用表格Paperwork中的图片列的PaperWorkID填充该列< / LI>
  • 根据数据长度和GroupID
  • 删除所有非重复项

任务3

  • 在表格中添加varbinary(max)列。
  • 根据表格中的PaperWorkID使用图片列的MD5哈希填充列
  • 根据MD5哈希和GroupID
  • 从表中删除所有非重复项

任务4

  • PaperWork
  • 进行2次备份
  • 根据表格中剩余的项目删除Paperwork中的重复记录。

如果从纸张扫描图像列的数据,则两次扫描几乎不可能产生完全相同的图像。如果数据上传了两次,那么你很幸运。