在我的PHP Web应用程序中,我试图完善逻辑,即一个用户定义的值,组装一个Transact-SQL查询,该查询对该值进行过滤。该查询然后使用ODBC驱动程序执行。并发症是过滤只能在派生字段上完成。除非派生字段是使用CASE表达式创建的字段,否则这是工作绝对正常的。MSSQL WHERE子句中的CASE - odbc错误
因此,举例来说,我有一个派生领域,如下列:
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END
如果我尝试和筛选此使用值“未处理”,那么最终组装查询显然是一个类似于以下:
SELECT * FROM table WHERE
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END = 'unprocessed'
然而,当这个运行我收到以下错误:
Warning: odbc_execute(): SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'from'., SQL state 37000 in SQLDescribeParameter in
我尝试运行SQL事件探查器,发现它似乎是在初始语句准备过程中引发错误,并且语句准备SQL应用程序将从字段名称中截断表达式。所以它看起来像这样:
SET FMTONLY ON select CASE WHEN [text_result] from table where 1=2 SET FMTONLY OFF go
当我通过MSSQL管理工作室运行生成的SQL语句并且它工作正常时,这被证实!
我希望一切都有道理。如果任何人有任何建议,如果这个问题是可以解决的,或者如果这只是一个驱动程序中的错误,那就太棒了!
这是我使用运行组装查询(提取出的类)的PHP:
$link = odbc_connect($strConnectionString,$username,$password);
$rResult = odbc_prepare($link,$qry);
$success = odbc_execute($rResult,$parameters);
的var_dump($ QRY,$参数):
string 'SELECT * FROM table WHERE
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END = ?'
array (size=1)
0 => string 'unprocessed'
显示你的PHP blahblah。 – Mihai
当然,PHP添加。 – Raiden616
请在你共享的代码之前运行'var_dump($ qry,$ parameters)'。 –