通配符'%',在ColdFusion cfscript查询LIKE语句中?

时间:2013-01-11 00:51:29

标签: sql sql-server sql-server-2008 coldfusion

是否可以在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标记中格式化查询有关?

6 个答案:

答案 0 :(得分:3)

是的,有可能。你在param中设置它是正确的。我不确定为什么它不和你合作。

我做了以下工作并且有效。

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();

答案 1 :(得分:1)

我建议使用CFQuery标记,而不是尝试在CFScript内运行查询。除非你真的知道你在做什么。我这样说是因为CFQuery标记具有一些内置功能,不仅可以使您更轻松地构建查询,还可以保护您免受不可预见的攻击(SQL注入类型)。例如,当使用CFQuery时,它会自动为您单引号转义,以便插入'well isn't that a mess'之类的内容不会让您感到沮丧。您还可以使用CFQueryParam标记进一步对抗SQL注入攻击。虽然您可以在CFQueryParam中使用CFScript功能,但它并不是那么简单(至少不适合我)。

See this blog post from Ben Nadel talking about some of this.

因此,在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>

答案 2 :(得分:0)

根据所使用的dbms,可以在运行sql语句时解释单引号和双引号。您使用的是什么dbms?您的语句现在不会选择变量中的值,而是选择姓氏为“lastname”的任何用户。它应该是这样的:

  lastname like '%#lastname#' 

答案 3 :(得分:0)

请记住,您最终需要了解CF为数据库服务器提供的内容。在这种情况下,您可以尝试使用此模型来关闭并通过弄乱param声明中的引号/值来在SSMS中找到相同的错误:

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

 SELECT name FROM users WHERE lastname LIKE @param1

答案 4 :(得分: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中的比较字段也是小写的,并且它起作用。

答案 5 :(得分: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();
相关问题