2017-10-11 52 views
1

まず、コード。 Coldfusion:cfqueryparamを含む動的クエリを実行

<cfquery name="qName" datasource="#dsn#"> 
    #myQueryStruct[arguments.type]# 
</cfquery> 

しかし、私はエラーを取得しています:私は動的に以下のようなクエリを実行する必要が

<cfset myQueryStruct = { 
qone = "select * from t1 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>", 
qtwo = "select * from t2 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>" 
}> 

:私は、クエリの構造体を作ってるんだ

Error Executing Database Query. 
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '<'. 

に思えますクエリの「<cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>」との間にエラーがあります(<)

試しましたevaluate()を使用して、このエラーを得ている:

Invalid CFML construct found on line 1 at column 15. 
ColdFusion was looking at the following text: 

t1 

は、私は私の質問は、私たちは私がを述べた方法のようにこれを行うことができます(私は何かが欠けている必要があります)され我々は<cfquery><cfif>はしごを使ってこれを行うことができます知っているが、 CFMLでは不可能ですか?

+0

'cfqueryparam'の' cfscript'バージョンを調べたいと思うかもしれません。確かに言うことはできませんが、あなたがしようとしていることに当てはまるかもしれません。 https://cfdocs.org/cfqueryparam – snackboy

+2

CFQUERYPARAMの使用は賞賛されますが、動的クエリでそれらを使用するのは難しいです。ソリューションについては、以下のAndreasの回答を参照してください。一方、cfqueryタグの間にコードを出力するだけでよいでしょう。これがcfqueryの目的であり、私が実際にスクリプトにタグを使用する場所の1つで、SQLマネージャから単純にコピーしてバインディングを追加するのが簡単です。 –

答えて

6

問題は、ColdFusionで処理する必要があるタグを含む文字列を渡すことです。しかし、あなたは遅すぎます。 CFはすでにテンプレートを解析しているため、文字列は変換されずに残っているため、SQLエラーがスローされます。

私は多分このコードのようなものが働くだろう、あなたはここで達成したいまさに、わからない:あなたが最初のデータのarguments.a1と種類を確立するためにCFPARAMを使用することができ

<cfscript> 
dsn = "myDatabase"; 
criteria = "something"; 
myQueryStruct = { 
    qone = "select * from t1 where column = (:a1) ", 
    qtwo = "select * from t2 where column = (:a1) " 
}; 

result1 = getQueryResult(queryString = myQueryStruct[ "qone" ], filterValue = criteria, dsn = dsn); 
result2 = getQueryResult(queryString = myQueryStruct[ "qtwo" ], filterValue = criteria, dsn = dsn); 

public function getQueryResult(queryString, filterValue, dsn){ 
    var qry = new Query(); 
    var qryString = arguments.queryString; 
    var queryResult = ""; 
    qry.setDatasource(arguments.dsn); 
    qry.setSQl(qryString); 
    qry.addParam(name="a1", value= arguments.filterValue, cfsqltype="cf_sql_varchar"); 
    queryResult = qry.execute().getResult(); 
    return queryResult; 
} 
</cfscript> 
+0

ありがとう、アンドレアス。 CFMLタグを使用してこれが可能だと思いますか? – Binod

+0

@Binodなぜスクリプトはありませんか? – Shawn

+0

プロジェクトはスクリプトを使用していません。それが理由です。私はCFエコシステムを初めて使っています。タグとスクリプトの2つのバリエーションについてどう思いますか?それぞれには独自の利点がありますか、それとも優れていますか? – Binod

0

とクエリ内で変数を '#arguments.a1#'として参照するだけです。それが問題を引き起こしているcfqueryparamタグであるかどうかを少なくとも理解するのに役立ちます。

関連する問題