4

ColdFusion cfscript クエリ内の SQL LIKE ステートメントでワイルドカードを使用することはできますか?

うまくいかない例:

local.q = new Query(); 
local.q.setDatasource(variables.dsn);
local.q.addParam(name='lastname', value='%' & arguments.lastname,     cfsqltype="cf_sql_varchar");
local.qString = 'SELECT name FROM users WHERE lastname LIKE :lastname';
local.q.setSQL(local.qString);
local.result = local.q.execute().getResult();

私もこれらを試しましたが、うまくいきませんでした:

local.qString = 'SELECT name FROM users WHERE lastname LIKE %:lastname';
local.qString = "SELECT name FROM users WHERE lastname LIKE '%:lastname'";

アップデート:

MS SQL Server 2008 を使用しています。

クエリは SQL Server Mgmt Studio 内で正常に動作します... cfscript タグ内でクエリをフォーマットする方法と関係があると思いますか?

4

7 に答える 7

3

はい、可能です。パラメータで設定していますが、これは正しいです。なぜあなたとうまくいかないのかわかりません。

私は次のことを行いましたが、うまくいきました。

var qryArgsCol = {};            
qryArgsCol.datasource = variables.datasource;
qryArgsCol.SQL = "                      
                SELECT ID
                FROM Users
                WHERE LastName LIKE :searchStringParam
                ";
var qryGetID = new query(argumentCollection=qryArgsCol);
qryGetID.addParam(name="searchStringParam", value="%" & searchString, cfsqltype="cf_sql_varchar");
qryGetIDResult = qryGetID.execute().getResult();
于 2013-07-29T14:39:23.897 に答える
0

使用するdbmsによっては、sqlステートメントの実行時に一重引用符と二重引用符が解釈される場合があります。どのDBMSを使用していますか?これで、ステートメントは変数の値を選択しませんが、姓が「lastname」であるユーザーを選択します。次のようになります。

  lastname like '%#lastname#' 
于 2013-01-12T02:24:42.740 に答える
0

最終的には、CFがDBサーバーに何を提供するかを確認する必要があることを覚えておいてください。この場合、このモックアップを試して、param宣言の引用符/値をいじることでSSMSで同じエラーを見つけることができます。

 declare @param1 varchar(max) = '%Eisenlohr';

 SELECT name FROM users WHERE lastname LIKE @param1
于 2013-01-22T15:47:28.740 に答える
0

ここに Adam Cameron からの応答がありますが、これは熱心すぎる mod によって削除されたようです。

彼の言うことを繰り返すのではなく、コピーして貼り付けただけです(重要な部分に強調を加えています):


最初の例で試した構文が機能することを明確にするためです。それがここでの正しいアプローチです。明確にする/説明する:

あなたが持っている例の<cfquery>バージョンは、次のようになります。

<cfqueryparam value="%foo">

したがって、関数バージョンでは、param は?or:paramNameになり、param の値は引き続き"%foo".

これ%は、SQL 文字列ではなく、param 値の一部です。

したがって、「機能しない」ということを考えると、エラーを投稿したり、機能していないと思われる原因が何であれ(あなたの期待と実際の結果) を投稿すると役立ちます。そうすれば、あなたの問題の実際の原因に対処することができますが、それはあなたが考えているものではないと思います.

クエリは正常に機能します<cfquery>か?

于 2013-01-18T11:30:37.320 に答える
0

このように使用します。

     local.q = new Query(); 
        local.q.setDatasource(variables.dsn);

        local.q.addParam(name="lastname", cfsqltype="cf_sql_varchar",value='%ARGUMENTS.lastname' );
        local.qString = 'SELECT name FROM users WHERE lastname LIKE :lastname';
        local.q.setSQL(local.qString);
        local.result = local.q.execute().getResult();
于 2015-03-25T18:50:44.423 に答える
0

CFQuery内でクエリを実行する代わりに、タグを使用することをお勧めしますCFScript。自分が何をしているのか本当にわかっていない限り。これは、CFQueryクエリの作成を容易にするだけでなく、予期しない攻撃 (SQL インジェクション タイプ) から保護する機能がタグに組み込まれているためです。たとえば、使用CFQueryすると、単一引用符が自動的にエスケープされるため、次のようなものを挿入しても問題が発生すること'well isn't that a mess'はありません。CFQueryParamまた、タグを使用して SQL インジェクション攻撃とさらに戦うことができるという利点もあります。CFQueryParamその中の機能を使用できるかもしれませんが、CFScriptそれほど簡単ではありません (少なくとも私にとってはそうではありません)。

これについては、Ben Nadel のこのブログ投稿を参照してください。

したがって、CFQueryタグでは、クエリは次のようになります。

<cfquery name="myQuery" datasource="#variables.dsn#">
    SELECT name
    FROM users
    WHERE lastname LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%:#arguments.lastname#" maxlength="256" />
</cfquery>
于 2013-01-18T17:30:14.873 に答える
0

「機能していない」という元のポスターと同じ問題に遭遇し、クエリのクエリから結果が得られませんでした。私にとっての問題は、ワイルドカード検索で大文字と小文字が区別されることです。

 local.q = new Query();  
 local.q.setDatasource(variables.dsn);
 local.q.addParam(name='lastname', value='%' & LCase(arguments.lastname), cfsqltype="cf_sql_varchar"); 
 local.qString = 'SELECT name FROM users WHERE LOWER(lastname) LIKE :lastname'; 
 local.q.setSQL(local.qString); 
 local.result = local.q.execute().getResult();

だから私がしたことは、着信引数が小文字であることを確認し、SQLの比較フィールドも小文字であることを確認し、それが機能することでした.

于 2014-06-17T23:01:48.220 に答える