PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows 严重问题

Posted

技术标签:

【中文标题】PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows 严重问题【英文标题】:PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows serious problem 【发布时间】:2009-11-23 15:18:17 【问题描述】:

我的申请有严重问题。

当我在我的 SQL Server 数据库中选择“CTE”,然后我使用 sqlsrv_num_rows 来计算结果对象中的行数时,我得到了奇怪的结果:-1。

这个值甚至在手册中都没有(链接:http://msdn.microsoft.com/en-us/library/ee376931(SQL.90).aspx)。

示例代码:

例如,W 已选择“CTE - 公用表表达式”:

$sql = ";WITH unsorted_cte AS
(
  SELECT
    *
  FROM
    xxx
  WHERE
    yyy
)

SELECT
  u_cte.*
FROM
  [unsorted_cte] u_cte
ORDER BY
    u_cte.[zzzz] ASC";

在 sql 控制台中,@@rowcount 具有正确的值,但是当我们在 php 脚本中使用此选择时,它返回 -1。

样本:

// make query with proper coursor

$result = sqlsrv_query($link, $sql, array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET));

// var dump shows us proper resource

var_dump($result):
resource(3) of type (SQL Server Statement)

// sqlsrv_num_rows show us wrong rows count

var_dump(sqlsrv_num_rows($result));
int(-1)

// sqlsrv_errors are empty

var_dump(sqlsrv_errors());
NULL

我尝试在整个 coursors http://msdn.microsoft.com/en-us/library/ee376927(SQL.90).aspx 和 Selecting Rows 参数中修复它,但我无法修复它。

顺便说一句。在我的情况下,唯一有效的选择行是 SQLSRV_CURSOR_FORWARD。

我的环境: PHP 5.3 微软 SQL 2005 视窗服务器 适用于 PHP 1.1 的 SQL Server 驱动程序 (msdn dot microsoft dot com/en-us/library/ee229551(SQL.10).aspx) 数据库编码:unicode

我希望,某人知道这个问题的解决方案。

【问题讨论】:

使用给定的工具格式化您的问题将使别人更容易帮助您。使用看起来像二进制字符串的按钮将代码格式化为代码。 【参考方案1】:

这里描述的问题是暴露了构建 sqlsrv 驱动程序的 ODBC 驱动程序中的一个错误。 ODBC 驱动程序对以 WITH 开头的 SQL 查询进行某种级别的解析,然后它会错误地处理这些查询。解决方法是将查询作为存储过程执行,这会更改 ODBC 驱动程序执行的代码路径。

SQL Server Native Client 团队(SNAC 是 Microsoft 的 ODBC 实现)已意识到此错误。我会确保他们知道这个错误造成的影响。

谢谢。

布莱恩·斯旺,微软

【讨论】:

以上是关于PHP + SQL Server + SQL Server Driver = sqlsrv_num_rows 严重问题的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server 跨服务器连接

Win 10 + IIS + PHP v7.1.7 + SQL Server 2008 R2如何让SQL Server连接正常工作?

使用 SQL Server Compact 与专用 SQL Server 数据库的缺点

SQL SERVER 获取拼音简称的函数

SQL Server 2012 - 开窗函数

Python和SQL Server 2017的强大功能