PHP的SQLSRV驱动程序无法完成在其他地方正常工作的存储过程查询

时间:2013-07-12 09:16:55

标签: php sql-server stored-procedures sqlsrv

所以我确信存储过程有效,我已经在SQL Server Management Studio中对它进行了测试,并在其他服务实例中运行。用于运行此SP的查询如下;

exec sp_getAgentCommissionDetails_v3 201000023762230, 5

所以它在SSMS和旧的MSSQL驱动程序下运行良好。但我像SQLSRV一样运行查询;

function mssql_query($string, $linkID = null, $batch = 0) {
    if (!$linkID) {
        global $dbhandle;

        $linkID = $dbhandle;
    }

    // SQLSRV_CURSOR_KEYSET ensures mssql_num_rows() works in most cases. Default scrollablility does not support this.
    return sqlsrv_query($linkID, $string, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
}

该函数名为mssql_query,因为我们正在将旧系统从MSSQL更新为SQLSRV,但我们正在处理一个非常混乱的旧系统。因此,我们不是试图重构它,而是使用SQLSRV覆盖MSSQL_query函数(已禁用mssql扩展)。 $ dbhandle是我们的SQLSRV连接资源。其他查询使用此方法运行正常。

所以我的问题 - 是否有任何原因运行存储过程的查询不会在此SQLSRV函数下运行?

记录我的故障排除;

我知道SQLSRV和PDO有一个特定的方法来运行存储过程。使用它不是一个选项,因为大量的代码库在不同的地方使用上面的方法,因为我们没有时间来重构每一页。

我提取了SQLSRV_errors()并返回'直接执行SQL;没有光标'。经过一些研究后,这似乎是驱动程序中的一个错误,它返回这个通用错误消息而不是更具体的错误消息,所以它可能意味着很多东西。 存储过程中不涉及游标或循环。

1 个答案:

答案 0 :(得分:0)

找到了解决方案。默认情况下,SQLSRV似乎将警告视为错误。通过连接文件中的配置更改来修复此问题;

sqlsrv_configure("WarningsReturnAsErrors",0);

现在运行正常。