2014-05-19 5 views
7

Sto cercando di ottenere il numero di righe restituite in una query. Il ciclo while scorrendo i risultati funziona, ma per qualche motivo i sqlsrv_num_rows non restituisce alcun valore:sqlsrv_num_rows Non restituisce alcun valore

$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'; 
} 

Grazie.

+1

perché non utilizzare creare un array di risultati e usare 'count()' per calcolare righe restituite. Solo un pensiero. –

risposta

12

È perché sqlsrv_query() utilizza SQLSRV_CURSOR_FORWARD tipo di cursore di default. Tuttavia, al fine di ottenere un risultato da sqlsrv_num_rows(), si dovrebbe scegliere uno di questi tipi di cursore di seguito:

  • SQLSRV_CURSOR_STATIC
  • SQLSRV_CURSOR_KEYSET
  • SQLSRV_CURSOR_CLIENT_BUFFERED

Per ulteriori informazioni, controllare: Cursor Types (SQLSRV Driver)

In conclusione, se si utilizza la query come:

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

otterrete comportare:

$row_count = sqlsrv_num_rows($query); 
0

Sono d'accordo con Jack. Conteggio (*) è un modo rapido per ottenere un conteggio delle righe, tuttavia, potrebbe essere necessario eseguire una scansione dell'indice cluster. Per i piccoli set di dati, questo non è un problema.

D'altra parte, è possibile utilizzare le viste del catalogo di sistema. Tuttavia, questi vengono aggiornati per qualche thread in background. Per set di dati da più terabyte, una ricerca nel catalogo potrebbe essere più veloce.

A seconda degli eventi di sistema, il conteggio può essere o meno accurato.

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

tutto dipende da quanto accurato è necessario essere. Se si tratta di dati del libro mastro, allora molto accurato. Se si tratta di dati previsionali, potrebbe essere meno preciso.

Suggerisco di utilizzare RCSI invece del valore predefinito READ COMMITTED per ottenere un conteggio del tempo migliore. Si sta utilizzando la sintassi SELECT COUNT (*) FROM [TABLE].

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

Randy Cavaliere ha avuto una grande presentazione in questo ultimo anno.

Puoi anche guardare la mia presentazione di isolamento che ha codice che dimostra che READ COMMITTED può essere inaccurato.

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

elencate di seguito sono tre soluzioni.

Buona fortuna

J

-- 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 di analisi e tempo di compilazione: CPU time = 0 ms, tempo trascorso = 0 ms.

(1 riga (e) interessata) Tabella "Indirizzo". Conteggio scan 1, letture logiche 36, letture fisiche 1, letture read-ahead 34, letture logiche lob 0, letture fisiche lob 0, letture lob read-ahead 0.

Tempi di esecuzione server SQL: CPU time = 15 ms , tempo trascorso = 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 di analisi e compilare il tempo: il tempo CPU = 15 ms, tempo trascorso = 132 ms.

(1 riga (e) interessata) Tabella 'sysidxstats'.Conteggio scansioni 1, letture logiche 2, letture fisiche 2, letture read-ahead 0, letture logiche lob 0, lob letture fisiche 0, letture read-ahead lob 0. Tabella 'sysschobjs'. Conteggio scansioni 1, letture logiche 6, letture letture fisiche 0, letture fisiche lob 0, letture lob leggere 0 lettura

Tempi di esecuzione SQL Server: tempo CPU = 0 ms , tempo trascorso = 36 ms.

*/

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

/*

SQL Server di analisi e compilare il tempo: il tempo CPU = 16 ms, tempo trascorso = 104 ms.

(1 riga (e) interessata) Tabella 'Worktable'. Conteggio scansioni 0, letture logiche 0, letture fisiche 0, letture read-ahead 0, letture logiche lob 0, lob letture fisiche 0, letture read-ahead lob 0. Tabella 'sysidxstats'. Conteggio scansioni 1, letture logiche 10, letture fisiche 2, letture read-ahead 0, letture logiche lob 0, lob letture fisiche 0, letture read-ahead lob 0. Tabella 'sysschobjs'. Conteggio scansioni 0, letture logiche 4, letture fisiche 2, letture read-ahead 0, letture logiche lob 0, letture lob fisiche 0, letture read-ahead lob 0. Tabella 'sysrowsets'. Intestazione 1, logico legge 6, letture fisiche 1, read-ahead legge 24, lob letture logiche 0, lob letture fisiche 0, pallonetto read-ahead legge 0.

esecuzione SQL Server Volte: CPU time = 0 ms , tempo trascorso = 34 ms.

*/