有几次我创建了一个cfquery,并且没有充分的理由,它不起作用。例如,我最近有这样的查询:
<cfquery name="get_projects" datasource="#application.dsn#">
SELECT *
FROM projects
WHERE project_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#project_id#">
<cfif start_date NEQ "">
AND project_start_date = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#start_date#">
</cfif>
ORDER BY project_name
</cfquery>
我确认start_date变量是一个空字符串。但是,我会得到一个指向该行的错误,并说“值无法转换为请求的类型”,即使它永远不会到达该行。
但是这里真的很奇怪......如果我在WHERE子句中添加“AND 1 = 1”,那么查询就可以完美地运行。
我在一些查询中偶尔会发生这种情况,但我不能说我认识到它的模式。始终是完美的查询。在某些情况下,查询之前正在运行,并且突然停止,可能是在文件中的其他位置发生更改时。我所要做的就是在WHERE子句中添加“AND 1 = 1”,然后再次工作。其他任何人遇到这个或有想法如何解决它?
答案 0 :(得分:4)
它是许多开发人员使用的捷径,这是一个例子
select * from table where 1 = 1
<cfif x EQ 1>and x = 1</cfif>
<cfif y EQ 1>and y = 1</cfif>
<cfif z EQ 1>and z = 1</cfif>
这总是有效的。有条件和3 ifs。但如果所有的ands都是假的,你最终会得到查询:
select * from table where 1=1
即返回所有记录
如果您有一个或多个and,并且您没有1 = 1,那么您最终得到:
select * from table where and x = 1
..哪个不起作用。所以它只是一个简单的快捷方式,可以确保所有的工作都能正常工作,无论你是否需要0或全部。
答案 1 :(得分:2)
我认为查询无论如何都是正确的 - AND
条款中没有OR
或WHERE
组合这两部分。
答案 2 :(得分:1)
我看不出上面的查询是如何按原样运行的。
我在您的CFIF声明中添加了AND。这应该运行(修复cfqueryparams时。
SELECT *
FROM projects
WHERE project_id = <cfqueryparam>
<cfif start_date NEQ "">
AND project_start_date = <cfqueryparam>
</cfif>
ORDER BY project_name
我经常使用这样的“AND 1 = 1”语句,其中我用1 = 1启动WHERE子句:
SELECT *
FROM projects
WHERE 1 = 1
AND project_id = <cfqueryparam>
<cfif start_date NEQ "">
AND project_start_date = <cfqueryparam>
</cfif>
ORDER BY project_name
答案 3 :(得分:1)
我已经看到它发生在查询被错误编译并且更改其中的任何文本部分(例如添加1 = 1)重新编译它。
答案 4 :(得分:0)
IIRC,Timestamp
与Date
不同。如果您使用的是MSSQL Server,请参阅http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx
<cfqueryparam cfsqltype="cf_sql_timestamp" value="#start_date#">
应该是
<cfqueryparam cfsqltype="cf_sql_date" value="#start_date#">
添加AND 1=1
可能会导致服务器的查询优化器忽略整个WHERE谓词。