2011-04-25 50 views
2

我得到一個類型不匹配錯誤,當我嘗試運行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

回答

2

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