执行 MSSQL 准备的查询时出现奇怪的错误


Weird error when executing MSSQL prepared query

我在odbc_*函数方面遇到了问题。这是我遇到问题的第一个查询。我有以下代码:

$conn = odbc_connect('DSN', 'USERNAME', 'PASSWORD');
$stmt = odbc_prepare($conn, "
    SELECT *
FROM Table1 AS a 
    INNER JOIN Table2 AS c 
        ON c.StudentId = a.StudentId 
            AND c.ContactId = ? 
            AND c.SetId = a.SetId 
    WHERE a.SetId = ? 
");
$result = odbc_execute($stmt, array('14153', '2013/2014'));

但是,这会产生错误:

Warning: odbc_execute(): SQL error: [Microsoft][ODBC SQL Server Driver]Invalid parameter number, SQL state S1093 in SQLDescribeParameter

如果我删除c.ContactId = ?并且不绑定值14153,则查询工作正常。

但是,我在另一个查询上绑定了相同的值,它工作正常!

有谁知道这个错误意味着什么?非常感谢

警告: odbc_execute((: SQL 错误: [Microsoft][ODBC SQL Server 驱动程序]参数号无效,SQL 状态 S1093 SQLDescribeParameter

这有很多奇怪的事情。首先,没有ODBC 3 API SQLDescribeParameter,它是SQLDescribeParam。然后是错误状态 S1093,它是 ODBC 2 状态,映射到 ODBC 3 中的 07009。

错误 07009 表示传递给 SQLDescribeParam 的参数编号错误,即在您的情况下不是 1 或 2,因此表明 PHP 中的底层 ODBC 支持出错或 SQLNumParams 返回了错误数量的参数。

我知道 SQL Server 驱动程序的 SQLDescribeParam 存在问题。为了支持 SQLDescribeParam,驱动程序将 SQL 重新组织为"选择p1_column,从表中p2_column"。有时驱动程序会弄错重组(请参阅此常见问题条目并向下查找数据截断错误(。

这些天我不做 PHP,也与 PHP 中的 ODBC 支持有任何关系,但我建议您从 ODBC 驱动程序管理器获取 ODBC 跟踪,这可能有助于确定问题。