ODBC Prepared Statement:WHERE子句中的CASE

时间:2014-07-30 08:36:14

标签: php sql-server odbc prepared-statement case

我正在尝试使用PHP的ODBC驱动程序在MSSQL数据库中进行比较。我试图将用户提供的值与CASE表达式返回的值进行比较。

这有效:

$r = odbc_prepare($link,"SELECT 'success' WHERE
        CASE WHEN 1 = 1 THEN 'foo' ELSE 'bar' END
         = 'foo'
       ");
$s = odbc_execute($r,array());

遗憾的是,这会返回错误:

$r = odbc_prepare($link,"SELECT 'success' WHERE
        CASE WHEN 1 = 1 THEN 'foo' ELSE 'bar' END
         = ?
       ");
$s = odbc_execute($r,array("foo"));

我得到的错误是:

Warning: odbc_execute(): SQL error: [Microsoft][ODBC SQL Server Driver]Syntax error or access violation, SQL state 37000 in SQLDescribeParameter

1 个答案:

答案 0 :(得分:0)

在SQL中使用参数时,许多ODBC包装器(如PHP)将尝试调用SQLDescribeParameter来查找参数。 MS SQL Server ODBC驱动程序尝试将SQL重新排列为select语句,然后使用标准函数来获取列类型,长度等。对于一些更复杂的SQL或SQL,它不包含表(如您的,例如,选择1)它无法将SQL重新排列为有效的选择,并且您得到了错误。

有两种解决方案:1)更改SQL,以便MS SQL Server ODBC驱动程序可以将其重新排列为选择2)更改ODBC包装器以了解这可能发生并默认为合理的。 Perl的DBD :: ODBC执行后者,这意味着人们不必执行前者。