sqlsrv_num_rows Не возвращает никакой ценности

Я пытаюсь получить количество строк, возвращаемых в запросе. Цикл цикла 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'; } 

Благодарю.

Это потому, что sqlsrv_query() по умолчанию использует SQLSRV_CURSOR_FORWARD курсора SQLSRV_CURSOR_FORWARD . Однако, чтобы получить результат из sqlsrv_num_rows() , вы должны выбрать один из следующих типов курсоров:

  • SQLSRV_CURSOR_STATIC
  • SQLSRV_CURSOR_KEYSET
  • SQLSRV_CURSOR_CLIENT_BUFFERED

Для получения дополнительной информации проверьте: Типы курсоров (драйвер SQLSRV)

В заключение, если вы используете свой запрос, например:

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

вы получите результат:

 $row_count = sqlsrv_num_rows($query); 

Я согласен с Джеком. Я считаю (*) быстрый способ получить количество строк, однако вам, возможно, придется выполнять кластерное сканирование индексов. Для небольших наборов данных это не проблема.

С другой стороны, вы можете использовать представления системного каталога. Тем не менее, они обновляются по некоторому фоновому потоку. Для наборов данных с несколькими терабайтами поиск каталога может быть более быстрым.

В зависимости от системных событий подсчет может быть или не быть точным.

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

Ниже перечислены три решения.

Удачи

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: время CPU = 0 мс, прошедшее время = 0 мс.

(Затронуты 1 строка) Таблица «Адрес». Число сканирования 1, логическое считывание 36, физическое чтение 1, чтение вперед 34, логическое чтение логических чисел 0, физическое чтение lob 0, чтение с чтением lob 0.

Время выполнения SQL Server: время CPU = 15 мс, прошедшее время = 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, логическое чтение лоб 0, физическое чтение lob 0, считывание с чтением lob 0. Таблица «sysschobjs». Число сканирования 1, логическое чтение 6, физическое чтение 3, чтение вперед 0, логическое чтение лоб 0, физическое чтение lob 0, чтение с чтением lob 0.

Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 36 мс.

* /

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

/ *

Время и время компиляции SQL Server: время процессора = 16 мс, прошедшее время = 104 мс.

(Затронуты 1 ряд (строк)) Таблица «Рабочий стол». Число сканирования 0, логическое чтение 0, физическое чтение 0, чтение вперед 0, логическое чтение lob 0, физическое чтение lob 0, чтение с чтением lob 0. Таблица «sysidxstats». Число сканирования 1, логическое чтение 10, физическое чтение 2, чтение вперед 0, логическое чтение lob 0, физическое считывание lob 0, чтение с открытым номером читает 0. Таблица «sysschobjs». Число сканирования 0, логическое чтение 4, физическое считывание 2, чтение вперед 0, логическое считывание логических чисел 0, физическое чтение lob 0, чтение с чтением lob. 0. Таблица «sysrowsets». Число сканирования 1, логическое чтение 6, физическое чтение 1, чтение вперед 24, логическое чтение лоб 0, физическое чтение lob 0, чтение с чтением lob 0.

Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 34 мс.

* /