2

我根据此链接中提供的帮助编写了以下查询,在 sql server 中使用 like 查询二进制列

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"但没有结果。如何解决这个问题?提前致谢

4

1 回答 1

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 可以处理的二进制值,如下所示:

<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>

(注意省略了0x前缀。)

于 2013-04-26T22:06:29.410 回答