COUNT(*)
подсчитывает общее количество строк в наборе данных; включая любые строки, которые полностью состоят из значения NULL
. Взять, к примеру:
WITH VTE AS(
SELECT CONVERT(int,NULL) AS N
UNION ALL
SELECT CONVERT(int,NULL) AS N
UNION ALL
SELECT CONVERT(int,NULL) AS N
UNION ALL
SELECT CONVERT(int,NULL) AS N
UNION ALL
SELECT CONVERT(int,NULL) AS N
UNION ALL
SELECT 1 AS N)
SELECT COUNT(*)
FROM VTE;
Обратите внимание, это возвращает 6, а не 1. Если вы хотели значение 1, то вам нужно будет использовать COUNT(N)
.
Без примеров данных это просто догадки, но я думаю, вам нужно использовать COUNT
с выражением CASE
, чтобы включать только строки, которые не являются верхними или нижними колонтитулами. Это псевдо-SQL, однако это будет что-то вроде:
COUNT(CASE WHEN <<Some expression that determines a row instead a header/footer>> THEN 1 END)
Кроме того, нет смысла использовать CONVERT(BIGINT,COUNT(<<expr>>)
. Если вы выполняете подсчет, который может вернуть более 2^31-1
строк, используйте COUNT_BIG
. Если вы не собираетесь возвращать более 2^31-1
строк, просто используйте COUNT
(вы возвращаете <500 строк, поэтому буквально нет причин использовать <code>bigint).