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

像这样使用。

     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

Just remember that you ultimately need to see what CF gives the DB server. In this instance, you can try this mockup to get close and find the same error in SSMS by messing with the quotes/value in the param declaration:

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

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

亚当·卡梅隆(Adam Cameron)在这里做出了回应,显然是被一个过分热心的模组删除了。

我没有重复他所说的,而是复制并粘贴(重点添加到关键部分):


只是为了澄清您在第一个示例中尝试的语法确实有效。这是正确的方法。澄清/解释:

您拥有的<cfquery>示例版本将类似于:

<cfqueryparam value="%foo">

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

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

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

查询是否可以正常工作<cfquery>

于 2013-01-18T11:30:37.320 回答
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 回答
0

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

  lastname like '%#lastname#' 
于 2013-01-12T02:24:42.740 回答