所以我确信存储过程有效,我已经在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;没有光标'。经过一些研究后,这似乎是驱动程序中的一个错误,它返回这个通用错误消息而不是更具体的错误消息,所以它可能意味着很多东西。 存储过程中不涉及游标或循环。
答案 0 :(得分:0)
找到了解决方案。默认情况下,SQLSRV似乎将警告视为错误。通过连接文件中的配置更改来修复此问题;
sqlsrv_configure("WarningsReturnAsErrors",0);
现在运行正常。