2012-06-23 81 views
1

我傳遞三個整數到一個函數在CFC,像這樣:CFQUERYPARAM ColdFusion中不工作10

<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中工作的任何線索?

+0

FWIW,您應該將type =「numeric」添加到您的CFARGUMENT中,因爲您無法使用CFQUERYPARAM。 –

回答

7

SELECT TOP #val(LOCAL.RecordsToReturn)#

SQL語句的某些部分不能使用cfqueryparam,如前或之後從表名。

+0

我不敢相信我不知道。 –

+1

只是爲了證明你的回答是正確的,這裏是皮特Frietag先生的一些文件〜http://www.petefreitag.com/item/677.cfm –

1

要記住的事情 - 和彼得的筆記,你鏈接到沒有明確說出這一點,埃維克 - 是有兩個部分給一個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的編碼語法。

這是否澄清情況更多?

+0

很好的解釋。我完全理解它。感謝您花時間寫這篇文章。 –

1

MS SQL的新語法(從2005年):select top(10)... for 10 you can have cfqueryparam。