CFQUERYPARAM не работает в ColdFusion 10

Я передаю три целых числа в функцию в CFC, например:

<cfscript> Q = TOPBIKES.GetTopBikes(127, 10, 11); writeDump(Q); </cfscript> 

CFC использует эти целые числа для запуска такого запроса:

 <!--- GET TOP BIKES ---> <cffunction name="GetTopBikes"> <cfargument name="FeatureID" required="true"> <cfargument name="MinWins" required="true"> <cfargument name="RecordsToReturn" required="true"> <cfscript> LOCAL.FeatureID = ARGUMENTS.FeatureID; LOCAL.MinWins = ARGUMENTS.MinWins; LOCAL.RecordsToReturn = ARGUMENTS.RecordsToReturn; </cfscript> <!--- RUN QUERY ---> <cfquery name="Q"> SELECT TOP #LOCAL.RecordsToReturn# B.BikeID, B.BikeName, BS.PCTWins FROM Bikes B LEFT JOIN BikeScores BS ON B.BikeID = BS.BikeID WHERE BS.Wins > <cfqueryparam cfsqltype="cf_sql_integer" value="#LOCAL.MinWins#"> AND B.BikeID IN ( SELECT BikeID FROM Bikes_Features WHERE FeatureID = <cfqueryparam cfsqltype="cf_sql_integer" value="#LOCAL.FeatureID#"> ) ORDER BY BS.PCTWins desc </cfquery> <cfreturn Q> </cffunction> 

Проблема в том, что я не могу заставить cfqueryparam работать в верхней части инструкции SQL.

Эти работы:

 SELECT TOP 11 SELECT TOP #LOCAL.RecordsToReturn# 

Это не работает:

 SELECT TOP <cfqueryparam cfsqltype="cf_sql_integer" value="#LOCAL.RecordsToReturn#"> 

Я могу, однако, использовать в другом месте в запросе. Я знаю, что это целое число и работает при использовании в другом месте, например, в замене FeatureID.

Любая подсказка относительно того, почему CFQUERYPARAM не работает в TOP?

SELECT TOP #val(LOCAL.RecordsToReturn)#

Некоторые части инструкции SQL не могут использовать cfqueryparam, например, Top или имя таблицы после From.

То, что нужно помнить – и примечания Питера, на которые вы ссылаетесь, явно не говорят об этом, Evik – это то, что в инструкции SQL есть две части: SQL-команды и данные, используемые командами SQL. Только данные могут быть параметризованы. Если вы думаете об этом, это имеет смысл: сами команды SQL не являются «параметрами».

Можно подумать в контексте CF здесь, для аналогии. Рассмотрим это утверждение:

 <cfset variables.foo = "bar"> 

Можно «параметризовать» это с переданным значением:

 <cfset variables.foo = URL.foo> 

(Где URL.foo является параметром в этом примере)

Но нельзя было ожидать этого:

 <#URL.tag# variables.foo = "bar"> 

(это очень надуманный пример, но он демонстрирует точку).

Я думаю, что по мере того, как SQL в <cfquery> идет, воды немного <cfquery> , потому что все это всего лишь строка в CF, и любая часть строки может быть заменена переменной (имена столбцов, логические операторы , целые статьи и т. д.). Поэтому по расширению можно подумать, что любую переменную можно заменить на <cfqueryparam> . Как мы знаем сейчас, это не так, поскольку в то время как все это всего лишь строка, касающаяся CF, она считается кодом для БД, поэтому она должна соответствовать синтаксису кодирования БД.

Означает ли это ситуацию больше?

новый синтаксис для MS SQL (с 2005 года): выберите top (10) … для 10 вы можете иметь cfqueryparam.