2013-04-26 5 views
2

я написал ниже запрос на основе помощи, предоставленной в этой ссылке, querying binary column using like in sql serverColdFusion: 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', 'Hex') #'? –

+0

Кроме того, вам может не понадобиться использовать cfqueryparams здесь - если значения статические (не динамически предоставленные третьей стороной), и у вас нет нескольких запросов с изменением значений (то есть SQL идентичны, за исключением двоичных значений) то, вероятно, нет никакой пользы в этом. –

+0

Спасибо, что он работает. вы правы, для статических значений нет никакой пользы. Но все же наш клиент хочет эту функцию. Еще раз спасибо. – RajVish

ответ

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>