【发布时间】:2014-09-18 08:36:46
【问题描述】:
在我的 PHP Web 应用程序中,我试图完善逻辑,即用户定义的值组装一个 Transact-SQL 查询,该查询过滤该值。然后使用 ODBC 驱动程序执行查询。复杂之处在于过滤只会在派生字段上进行。除了派生字段是使用 CASE 表达式创建的字段之外,这绝对可以正常工作。
因此,例如,我有一个派生字段,如下所示:
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,$parameters):
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。
-
请在您共享的代码之前运行
var_dump($qry, $parameters)。 -
您的第二个 case 语句省略了 WHEN。
-
您是否尝试过使用更标准的“AS [未处理]”语法为计算列命名? CASE WHEN blah blah END AS [ColumnName] 是首选语法。我不知道这是否让您感到困惑,但可能是这样。
-
Var_dumps 添加。 @ron tomambe 抱歉,这是我的错误,不是在代码中复制。
标签: php sql sql-server odbc case