【问题标题】:PHP's SQLSRV driver would not complete a Stored Procedure query that works normally elsewherePHP 的 SQLSRV 驱动程序无法完成在其他地方正常工作的存储过程查询
【发布时间】:2013-07-12 09:16:55
【问题描述】:

所以我确信存储过程可以正常工作,我已经在 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() 并返回 'Executing SQL directly;没有光标'。经过一番研究,这似乎是驱动程序中的一个错误,它返回此通用错误消息而不是更具体的有用消息,因此它可能意味着很多事情。 存储过程中不涉及游标或循环。

【问题讨论】:

  • $string 的开头添加SET CONCAT_NULL_YIELDS_NULL ON; SET ANSI_WARNINGS ON; SET ANSI_PADDING ON; 可能会有所帮助。

标签: php sql-server stored-procedures sqlsrv


【解决方案1】:

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

sqlsrv_configure("WarningsReturnAsErrors",0);

它现在运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2016-05-03
    • 2019-02-08
    相关资源
    最近更新 更多