我试图获取查询中返回的行数。循环遍历结果的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';
}
感谢。
答案 0 :(得分:19)
这是因为sqlsrv_query()
默认使用 SQLSRV_CURSOR_FORWARD
游标类型。但是,为了从sqlsrv_num_rows()
获得结果,您应该选择以下其中一种游标类型:
有关详情,请查看: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。
* /