2013-04-26 56 views
2

我寫了下面的查詢基於該鏈接提供的幫助,querying binary column using like in sql server的ColdFusion:cfqueryparam二進制值

SELECT * FROM myTable 
WHERE TestData >= 0x00010000 
    AND TestData < 0x00020000; 

它返回了預期的效果。我用cfqueryparam和更新的查詢爲:

SELECT * FROM myTable 
WHERE TestData >= <cfqueryparam value="0x00010000" cfsqltype="cf_sql_binary"> 
    AND TestData < <cfqueryparam value="0x00020000" cfsqltype="cf_sql_binary">; 

但它返回的錯誤,錯誤消息:Invalid data 0x00010000 for CFSQLTYPE CF_SQL_BINARY. 我試着用cfsqltype="CF_SQL_BLOB",但沒有結果。 如何解決這個問題?在此先感謝

+3

該錯誤可能是因爲您傳遞的是字符串,而不是二進制值。嘗試'#BinaryDecode('00010000','十六進制')#'? – 2013-04-26 11:22:52

+0

此外,您可能不需要在這裏使用cfqueryparams - 如果值是靜態的(不是由第三方動態提供的),並且沒有多個只有值更改的查詢(即SQL除二進制值之外都是相同的),則那麼這樣做可能沒有任何好處。 – 2013-04-26 11:26:45

+0

謝謝你的工作。你是對的,對於靜態值沒有好處。但是我們的客戶仍然需要這個功能。再次感謝。 – RajVish 2013-04-26 11:41:32

回答

3

因爲它的立場,沒有什麼內在的錯誤保存查詢爲:(理論上,應該將上市的各列,而不是使用*雖然)

SELECT * FROM myTable 
WHERE TestData >= 0x00010000 AND TestData < 0x00020000 

然而,儘管對這些查詢進行參數化並沒有安全方面的好處(它們沒有變量,因此也不傾向於SQL注入),但爲了緩存單個執行計劃,使用參數化SQL仍有好處。

如果你有多個查詢,窗體:

<cfquery...> 
    SELECT * FROM myTable 
    WHERE TestData >= 0x00010000 AND TestData < 0x00020000 
</cfquery> 

<cfquery...> 
    SELECT * FROM myTable 
    WHERE TestData >= 0x00020000 AND TestData < 0x00030000 
</cfquery> 

<cfquery...> 
    SELECT * FROM myTable 
    WHERE TestData >= 0x00030000 AND TestData < 0x00040000 
</cfquery> 

使用cfqueryparam這些將允許一個單一的執行計劃被緩存的多個查詢,可能導致更好的性能。

在這種情況下,你需要使用BinaryDecode將十六進制字符串轉換成二進制值cfqueryparam可以處理,像這樣:(注意0x前綴被省略)

<cfquery...> 
    SELECT * FROM myTable 
    WHERE TestData >= <cfqueryparam value=#BinaryDecode('00010000','Hex')# cfsqltype="cf_sql_binary" /> 
    AND TestData < <cfqueryparam value=#BinaryDecode('00020000','Hex')# cfsqltype="cf_sql_binary" /> 
</cfquery>