我将三个整数传递给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语句的TOP部分工作。
这些工作:
SELECT TOP 11
SELECT TOP #LOCAL.RecordsToReturn#
这不起作用:
SELECT TOP <cfqueryparam
cfsqltype="cf_sql_integer"
value="#LOCAL.RecordsToReturn#">
然而,我可以在查询中的任何其他位置使用。我知道它是一个整数,并且在其他地方使用时可以替代FeatureID。
有关为什么CFQUERYPARAM无法在TOP工作的任何线索?
答案 0 :(得分:7)
SELECT TOP #val(LOCAL.RecordsToReturn)#
SQL语句的某些部分不能使用cfqueryparam,例如From之后的Top或表名。
答案 1 :(得分:1)
要记住的事情 - 以及Peter链接的说明没有明确说明这一点,Evik - 是SQL语句的两个部分:SQL“命令”,以及SQL命令使用的数据。只能对参数化数据进行参数化。如果你考虑一下,这是有道理的:SQL命令本身不是“参数”。
人们可以在CF环境中思考这个类比。请考虑以下声明:
<cfset variables.foo = "bar">
可以用传入的值“参数化”:
<cfset variables.foo = URL.foo>
(其中URL.foo是此示例中的参数)
但人们不能指望这样做:
<#URL.tag# variables.foo = "bar">
(这是一个非常人为的例子,但它证明了这一点)。
我认为,就<cfquery>
中的SQL而言,水域有点混乱,因为整个事物只是CF中的一个字符串,并且字符串的任何部分都可以与变量交换掉(列名,布尔运算符,整个子句等)。因此,通过扩展,人们可能会认为任何变量都可以用<cfqueryparam>
替换。正如我们现在所知,情况并非如此,因为就CF而言,它只是一个字符串,它被认为是数据库的代码,因此需要符合DB的编码语法。 / p>
这是否更能澄清情况?
答案 2 :(得分:1)
MS SQL的新语法(自2005年起):select top(10)... 10你可以有cfqueryparam。