2014-05-19 71 views
7

我想獲取查詢中返回的行數。 while循環遍歷結果循環工作,但由於某種原因,sqlsrv_num_rows不返回任何值: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'; 
} 

感謝。

+1

爲什麼不使用創建結果的數組,並使用'計數()'來計算返回的行。只是一個想法。 –

回答

12

這是因爲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); 
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毫秒,經過時間= 0毫秒。 (1行受影響) 表'地址'。掃描計數1,邏輯讀取36,物理讀取1,預讀讀取34,lob邏輯讀取0,lob物理讀取0,lob預讀讀取0.

SQL Server執行時間: CPU時間= 15 ms ,經過時間= 26毫秒。

*/

-- 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毫秒,經過時間= 132毫秒。 (1行受影響) 表'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毫秒。

*/

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

/*

SQL Server分析和編譯時間: CPU時間= 16毫秒,經過時間= 104毫秒。 (1行受影響) 表'工作臺'。掃描計數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毫秒。

*/