sqlsrv_num_rows不返回任何值

时间:2014-05-19 15:23:25

标签: php sqlsrv

我试图获取查询中返回的行数。循环遍历结果的while循环有效,但由于某种原因,sqlsrv_num_rows不返回任何值:

$result = "SELECT * from dtable WHERE id2 = 'apple'";
$query = sqlsrv_query($conn, $result);

$row_count = sqlsrv_num_rows($query);
echo $row_count;

while($row = sqlsrv_fetch_array($query))
{
      echo 'yes';
}

感谢。

2 个答案:

答案 0 :(得分:19)

这是因为sqlsrv_query()默认使用 SQLSRV_CURSOR_FORWARD 游标类型。但是,为了从sqlsrv_num_rows()获得结果,您应该选择以下其中一种游标类型:

  • SQLSRV_CURSOR_STATIC
  • SQLSRV_CURSOR_KEYSET
  • SQLSRV_CURSOR_CLIENT_BUFFERED

有关详情,请查看:Cursor Types (SQLSRV Driver)

总之,如果您使用以下查询:

$query = sqlsrv_query($conn, $result, array(), array( "Scrollable" => 'static' ));

你会得到结果:

$row_count = sqlsrv_num_rows($query);

答案 1 :(得分:0)

我同意杰克。我数(*)是获取行计数的快捷方法,但是,您可能必须进行聚簇索引扫描。对于小型数据集,这不是问题。

另一方面,您可以使用系统目录视图。但是,这些会根据某些后台线程进行更新。对于数TB的数据集,目录查找可能会更快。

根据系统事件,计数可能准确也可能不准确。

http://sqlblog.com/blogs/kalen_delaney/archive/2009/12/07/how-many-rows.aspx

这完全取决于你需要多准确。如果是分类帐数据,则非常准确。如果是预测数据,则可能不太准确。

我建议使用RCSI而不是默认的READ COMMITTED来获得更好的时间点。这是使用 SELECT COUNT(*)FROM [TABLE] 语法。

http://www.sqlpass.org/summit/2013/Sessions/SessionDetails.aspx?sid=4730

兰迪奈特去年对此进行了精彩的演讲。

您还可以查看我的隔离演示文稿,其中包含的代码证明READ COMMITTED可能不准确。

http://craftydba.com/?page_id=880

下面列出了三种解决方案。

祝你好运

Ĵ

-- Show time & i/o
SET STATISTICS TIME ON
SET STATISTICS IO ON
GO

-- Remove clean buffers & clear plan cache
CHECKPOINT 
DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE
GO

-- test database
use adventureworks2012
go


-- traverse the table
select count(*) as 'rows' from person.address
go

/ *

SQL Server解析和编译时间:    CPU时间= 0 ms,经过时间= 0 ms。

(1行(s)受影响) 表'地址'。扫描计数1,逻辑读取36,物理读取1,预读读取34,lob逻辑读取0,lob物理读取0,lob预读读取0。

SQL Server执行时间:    CPU时间= 15 ms,经过时间= 26 ms。

* /

-- Look at sysindexes
select o.name as 'Table', max(i.rows) 'Rows'
from sysobjects o join sysindexes i
on o.id = i.id
where 
(i.indid = 1 or i.indid = 0) and
o.type = 'U' and
o.name = 'Address'
group by o.name
go

/ *

SQL Server解析和编译时间:    CPU时间= 15 ms,经过时间= 132 ms。

(1行(s)受影响) 表' sysidxstats'。扫描计数1,逻辑读取2,物理读取2,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表' sysschobjs'。扫描计数1,逻辑读取6,物理读取3,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。

SQL Server执行时间:    CPU时间= 0 ms,经过时间= 36 ms。

* /

-- Look at sys.partitions
SELECT max(rows) as 'Rows'  FROM sys.partitions 
WHERE object_id = object_id('Person.Address');

/ *

SQL Server解析和编译时间:    CPU时间= 16 ms,经过时间= 104 ms。

(1行(s)受影响) 表'工作台'。扫描计数0,逻辑读取0,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表' sysidxstats'。扫描计数1,逻辑读取10,物理读取2,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表' sysschobjs'。扫描计数0,逻辑读取4,物理读取2,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。 表' sysrowsets'。扫描计数1,逻辑读取6,物理读取1,预读读取24,lob逻辑读取0,lob物理读取0,lob预读读取0。

SQL Server执行时间:    CPU时间= 0 ms,经过时间= 34 ms。

* /