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