CFQUERYPARAM不ColdFusion的10个工作(CFQUERYPARAM not wor

2019-10-16 22:03发布

我传递三个整数到一个函数在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不处于最佳工作?

Answer 1:

SELECT TOP #val(LOCAL.RecordsToReturn)#

SQL语句的某些部分不能使用cfqueryparam,如前或之后从表名。



Answer 2:

事情要记住 - 和你做链接彼得的笔记没有明确说这一点,Evik - 是,有两个部分的SQL语句:在SQL“命令”,以及正在使用的SQL命令的数据。 只有数据可以进行参数设置。 如果你想想看,这是有道理的:在SQL命令本身不是“参数”。

我们可以把在CF背景这里,用于进行类比。 此声明:

<cfset variables.foo = "bar">

人们可以“参数化”这一个传入的值:

<cfset variables.foo = URL.foo>

(其中URL.foo是在这个例子中的参数)

但是,人们不能指望这样做:

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

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

我认为,只要在SQL中的<cfquery>去,因为整个事情只是在CF的字符串,字符串的任何部分水域有点浑可以被交换出具有可变(列名,布尔运算符,整个子句等)。 因此,通过扩展人们可能会认为任何变量可以用替换<cfqueryparam> 正如我们现在知道,这是不是这样的,因为虽然这一切都只是一个字符串就CF而言,它被认为代码数据库,所以需要符合数据库的编码语法。

这是否澄清有关情况吗?



Answer 3:

对于MS SQL(2005年)新的语法:选择顶(10)... 10,你可以有cfqueryparam。



文章来源: CFQUERYPARAM not working in ColdFusion 10