Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 古代微软数据库管理系统中的汉明距离 问题_Sql Server_Tsql_Hamming Distance_Sql Server 7 - Fatal编程技术网

Sql server 古代微软数据库管理系统中的汉明距离 问题

Sql server 古代微软数据库管理系统中的汉明距离 问题,sql-server,tsql,hamming-distance,sql-server-7,Sql Server,Tsql,Hamming Distance,Sql Server 7,我想在MS SQL Server 7中查找图像副本和类似图像 编辑 我使用sql游标运行了它-虽然速度很慢,但可以工作,再次感谢您的评论。看看我的答案,我想出了解决办法 明确地 我有一个数据库,其中包含图像路径和相关图像的指纹,这些图像是在计算机的帮助下计算出来的。我使用了一种变体,在二进制16列中,每个图像水平和垂直梯度存储128位 我希望能够做到以下几点: 声明@id INT 设置@id=。。。 声明@gived_散列二进制16 SET@gived_hash=。。。 选择前10个文件路径、哈

我想在MS SQL Server 7中查找图像副本和类似图像

编辑 我使用sql游标运行了它-虽然速度很慢,但可以工作,再次感谢您的评论。看看我的答案,我想出了解决办法

明确地 我有一个数据库,其中包含图像路径和相关图像的指纹,这些图像是在计算机的帮助下计算出来的。我使用了一种变体,在二进制16列中,每个图像水平和垂直梯度存储128位

我希望能够做到以下几点:

声明@id INT 设置@id=。。。 声明@gived_散列二进制16 SET@gived_hash=。。。 选择前10个文件路径、哈希、, hamming_distancehash,@给定_hash作为距离 从我的桌子上
其中距离我使用SQL游标和临时表运行它。再次感谢@Tomalak

我提供我的实现供将来参考,希望这对任何人都有用

创建过程hamming_distance128 @哈希二进制16, @提供二进制16, @距离锡输出 像 声明@i INT,@j INT 设置@i=1 设置@j=1 声明@counttinyint 设置@count=0 声明@byte TINYINT 声明@length TINYINT 设置@length=16 而@i=@min\u 开始 插入距离id,相似性 值@tmp_id,@相似性 终止 终止 从行游标获取下一个 进入@tmp_id,@dhash 终止 关闭行光标 取消分配行游标 选择hashes.id、distance.similarity 远距离 内部连接哈希 ON hashes.id=distance.id 按距离排序。相似性描述 升降台距离
最有可能的情况是,您必须在表中循环并应用您最喜欢的编程语言中的函数。什么不让我说?我感觉你是对的,但我希望不必为此编写自定义SQL Server dll。。。我有一种感觉,它无论如何都不被支持。不允许我只是意味着我不能使用该存储过程来计算查询中的列值。。。我不知道这通常是否可行,它只是拒绝这样做:-使用临时表和游标来填充它怎么样?您可以将其包装在另一个存储过程中,并返回临时表作为其结果。@Tomalak:谢谢您的建议,我不是SQL专业人士,但我在阅读了SQL游标之后,它就开始工作了-每个来源都强烈建议不要使用它们,但现在我看不到其他方法。有关解决方案,请参阅我的update@vanhelgen源代码在解决方案方面是正确的,包括游标,由于游标的顺序性,它们的速度要慢得多。然而,游标的存在是有原因的。它们可以解决查询无法解决的问题。在SQLServer7.0上,这就是一个问题。这里的光标没有问题。将我的解决方案移到了答案上——这真的让更多的人觉得我只是发现了一个bug。在开始时调用fetchnext两次,从而忽略第一行。您应该在循环开始之前将FETCH NEXT从rowCursor调用到@tmp_id,@dhash,然后在每次迭代结束时重复调用。不客气。我认为代码的其余部分看起来不错。
CREATE PROCEDURE hamming_distance128
    @hash BINARY(16),
    @supplied BINARY(16)
AS
    DECLARE @i INT, @j INT
    SET @i = 1
    SET @j = 1

    DECLARE @count INT
    SET @count = 0

    DECLARE @byte TINYINT

    DECLARE @length TINYINT
    SET @length = 16

    WHILE @i <= @length
    BEGIN
        SET @j = 1
        SET @byte = CAST((ASCII(SUBSTRING(@hash,@i,1)) ^ ASCII(SUBSTRING(@supplied,@i,1))) AS TINYINT)

        WHILE @j < 256
        BEGIN
            SET @count = @count + (CASE (@byte & @j) WHEN 0 THEN 0 ELSE 1 END)
            SET @j = @j * 2
        END

        SET @i = @i + 1
    END

    SELECT @count
GO