1

我将三个整数传递给 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 中工作的任何线索?

4

3 回答 3

7

SELECT TOP #val(LOCAL.RecordsToReturn)#

SQL 语句的某些部分不能使用 cfqueryparam,例如 Top 或 From 后面的表名。

于 2012-06-23T16:43:59.527 回答
1

要记住的事情 - 以及您链接到的 Peter 的注释,Evik 没有明确说明这一点 - SQL 语句有两个部分:SQL“命令”和 SQL 命令使用的数据。只有数据可以参数化。如果您考虑一下,那是有道理的:SQL 命令本身不是“参数”。

可以在此处的 CF 上下文中进行类比。考虑这个陈述:

<cfset variables.foo = "bar">

可以使用传入的值“参数化”它:

<cfset variables.foo = URL.foo>

(其中 URL.foo 在此示例中是一个参数)

但人们不能指望这样做:

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

(这是一个非常人为的例子,但它证明了这一点)。

我认为就 a 中的 SQL<cfquery>而言,水域有些混乱,因为整个事情只是 CF 中的一个字符串,字符串的任何部分都可以用变量(列名、布尔运算符、整个子句, ETC)。因此,通过扩展,人们可能会认为任何变量都可以替换为<cfqueryparam>. 正如我们现在所知,情况并非如此,因为就 CF 而言,它只是一个字符串,但它被视为 DB 的代码,因此需要符合 DB 的编码语法。

这是否更清楚地说明了情况?

于 2012-06-24T08:01:15.127 回答
1

MS SQL 的新语法(从 2005 年开始):选择 top(10) ... 对于 10,您可以使用 cfqueryparam。

于 2013-10-08T12:45:52.510 回答