我正在尝试使用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
答案 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执行后者,这意味着人们不必执行前者。