1

次のように、CFC の関数に 3 つの整数を渡しています。

<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>

問題は、SQL ステートメントの TOP 部分で cfqueryparam を機能させることができないことです。

これらは機能します:

SELECT      TOP 11
SELECT      TOP #LOCAL.RecordsToReturn#

これは動作しません:

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

ただし、クエリの他の場所でも使用できます。私はそれが整数であることを知っており、FeatureID の代わりに他の場所で使用すると機能します。

TOPでCFQUERYPARAMが機能しない理由についての手がかりはありますか?

4

3 に答える 3

7

SELECT TOP #val(LOCAL.RecordsToReturn)#

Top や From の後のテーブル名など、SQL ステートメントの一部では cfqueryparam を使用できません。

于 2012-06-23T16:43:59.527 に答える
1

MS SQL の新しい構文 (2005 年以降): select top(10) ... 10 の場合、cfqueryparam を使用できます。

于 2013-10-08T12:45:52.510 に答える
1

覚えておくべきこと - そしてあなたがリンクしているピーターのメモでは、これを明示的に述べていません、Evik - SQL ステートメントには 2 つの部分があるということです。パラメータ化できるのはデータのみです。考えてみると、それは理にかなっています。SQL コマンド自体は「パラメーター」ではありません。

類推のために、ここで CF コンテキストで考えることができます。次のステートメントを検討してください。

<cfset variables.foo = "bar">

渡された値でこれを「パラメータ化」できます。

<cfset variables.foo = URL.foo>

(この例では URL.foo がパラメータです)

しかし、これを行うことは期待できませんでした:

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

(これは非常に不自然な例ですが、要点を示しています)。

<cfquery>全体がCFの単なる文字列であり、文字列の任意の部分を変数(列名、ブール演算子、句全体など)。したがって、拡張により、任意の変数を<cfqueryparam>. 現在わかっているように、これは当てはまりません。CF に関する限り、これはすべて単なる文字列ですが、DB に対するコードと見なされるため、DB のコーディング構文に準拠する必要があります。

これは状況をより明確にしますか?

于 2012-06-24T08:01:15.127 に答える