VB/VBScript中 - 相比在WHERE语句(SQL Server)的二进制值

VB/VBScript中 - 相比在WHERE语句(SQL Server)的二进制值

问题描述:

我得到一个类型不匹配错误,当我尝试运行SQL语句是这样的:VB/VBScript中 - 相比在WHERE语句(SQL Server)的二进制值

Dim s 
s = "test" 
"SELECT id FROM mytable WHERE sha1bin = " & SHA1bin(s) 

这是我的SHA1bin功能:

Private Function SHA1Bin(s) 
    Dim asc, enc, bytes 
    Set asc = CreateObject("System.Text.UTF8Encoding") 
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider") 
    bytes = asc.GetBytes_4(s) 
    SHA1Bin = enc.ComputeHash_2((bytes)) 
    Set asc = Nothing 
    Set enc = Nothing 
End Function 

据我所知,VBScript并没有真正的二进制数据类型。我需要做什么来进行比较,或者我应该将它存储为40个字符的十六进制值,以便我可以进行文本比较?

+0

的SQL Server版本您使用的?此外,你是否尝试'“SELECT ID FROM mytable WHERE sha1bin ='”&SHA1bin(s)&“'”'? – stealthyninja 2011-04-25 20:57:07

+0

SQL Server 2008 Express。我用引号试过了,没有用。 SQL Server 2008确实有一个HashBytes函数。我想我可以使用它,如果我将我的代码更改为使用存储过程。任何方式在我的SQL语句中使用该函数? – HK1 2011-04-25 21:14:00

ComputeHash_2返回一个字节数组。

首先,你的字节数组转换为十六进制字符串:

Dim pos,hexs 
For pos = 1 To Lenb(bytes) ' bytes is your resulting byte array ' 
hexs = hexs & LCase(Right("0" & Hex(Ascb(Midb(bytes, pos, 1))), 2)) 
Next 

然后,用T-SQL的CONVERT比较:

Dim Query 
Query="SELECT id FROM mytable WHERE sha1bin = CONVERT(varbinary(max), 0x" & hexs & ")" 
+0

您的解决方案运作良好。我其实只是改变了上面的函数,以便它返回十六进制而不是二进制。换句话说,我在SHA1函数中插入了第一个代码。我无法做任何真正的科学测试,但似乎我的代码现在可以通过查找散列值而不是比较全文字符串来更快地运行。 – HK1 2011-04-26 00:41:34