在ColdFusion的cfscript查询中,通配符'%'怎么使用?

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 管理工具中,查询正常运行……我认为这与如何在 cfscript 标签中格式化查询有关?


2
你的数据库管理系统是否不支持以 % 作为第一个字符使用 LIKE 操作符? - Henry
这在 MS SQL 中运行良好。我倾向于认为 Henry 的想法是不被支持的。 - Paul
6
“Didn't work”这个说法含糊不清。它指什么?你收到了错误吗?你没有得到预期的结果吗?如果你没有得到预期的结果,你是否尝试在ColdFusion之外运行以帮助隔离问题? - Dan Bracuk
在 MSSQL 中,使用标签 <cfqueryparam value="%#arguments.lastname#"> 是正确的语法。看起来你正在尝试做这件事情,所以你的数据库管理系统可能不支持这个。 - Matt Busche
2
小提示,由于许多事情都是特定于数据库的,请在 sql 问题中始终包含数据库类型和版本。当人们不必猜测您使用的是哪种数据库时,您将获得更快、更准确的答案 :) - Leigh
不是要老调重弹,但你需要解释一下“不起作用”和“正常工作”的具体意思。正如其他人所提到的那样,上述代码在SQL Server中可以无错误运行,并成功返回所有以提供的参数结尾的记录。那么你得到了什么结果,而你实际期望的结果是什么? - Leigh
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();

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

0
我建议使用CFQuery标签而不是尝试在CFScript中运行查询,除非你真的知道你在做什么。我这么说是因为CFQuery标签具有一些内置功能,不仅可以使构建查询更容易,还可以保护您免受意外攻击(如SQL注入)。例如,当使用CFQuery时,它会自动为您转义单引号,以便插入像'well isn't that a mess'这样的内容不会对您造成影响。您还可以使用CFQueryParam标签进一步防止SQL注入攻击。虽然您可能能够在CFScript中使用CFQueryParam功能,但这并不是那么直接(至少对我来说不是)。

请参阅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>

1
我不得不移除外部单引号并省略冒号,例如 LIKE <cfqueryPARAM value='#Form.Model_srch#%' CFSQLType='CF_SQL_VARCHAR'> - samus
是的,你说得对。这个例子不需要外面的引号。我会从我的答案中删除它们。谢谢。 - Miguel-F

0

请记住,您最终需要查看CF向数据库服务器提供的内容。在这种情况下,您可以尝试使用此模拟来接近并通过在参数声明中操纵引号/值来在SSMS中找到相同的错误:

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

 SELECT name FROM users WHERE lastname LIKE @param1

0

根据使用的数据库管理系统,当运行 SQL 语句时,单引号和双引号可能会被解释。你使用的是哪个数据库管理系统?你现在的语句并没有选择变量中的值,而是选择了任何姓氏为“lastname”的用户。应该像这样:

  lastname like '%#lastname#' 

实际上这就是他们的CF代码已经在做的事情。他们只是通过参数(即绑定变量)添加了值“%#arguments.lastName#”。 - Leigh

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中进行比较的字段也为小写,然后它就奏效了。


是的,QoQ(Query of Queries)始终区分大小写:来自文档:"与 ColdFusion 的其余部分不同,Query of Queries 区分大小写..."。 - Leigh

0
这里有Adam Cameron的回复,但显然被一个过于热心的版主删除了。
我不想重复他说的话,所以我只是复制并粘贴了他的回复(关键部分已加粗):

只是想澄清一下,你在第一个例子中尝试的语法是可以工作的。这是正确的方法。为了澄清/解释:

你所提供的示例的<cfquery>版本应该是这样的:

<cfqueryparam value="%foo">

所以在函数版本中,参数将是?:paramName,参数的值将继续是"%foo"

%是参数值的一部分,而不是SQL字符串。

因此,如果“对您没有用”,如果您发布错误或导致您认为它不起作用的任何内容(您的期望是什么,实际结果是什么),那么这将有所帮助。然后我们可以处理您问题的实际原因,这不是您认为的那样。

查询作为<cfquery>是否正常工作?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接