Trong SQL Server, COUNT_BIG()
và hàm COUNT()
về cơ bản làm điều tương tự:trả về số lượng mục được tìm thấy trong một nhóm. Về cơ bản, bạn có thể sử dụng các hàm này để tìm ra có bao nhiêu hàng trong một bảng hoặc tập hợp kết quả.
Trong nhiều trường hợp, bạn có thể chọn bất kỳ cái nào bạn thích. Tuy nhiên, có sự khác biệt giữa hai chức năng này có thể khiến bạn phải sử dụng chức năng này thay vì chức năng kia.
Sự khác biệt là COUNT()
trả về kết quả của nó dưới dạng int , trong khi COUNT_BIG()
trả về kết quả của nó dưới dạng bigint .
Nói cách khác, bạn sẽ cần sử dụng COUNT_BIG()
nếu bạn mong đợi kết quả của nó lớn hơn 2.147.483.647 (tức là nếu truy vấn trả về nhiều hơn 2.147.483.647 hàng).
Ví dụ 1 - Khi COUNT () là OK
Dưới đây là một ví dụ cơ bản cho thấy một tình huống trong đó cả COUNT()
và COUNT_BIG()
có thể được sử dụng:
USE WideWorldImportersDW; SELECT COUNT(*) AS 'COUNT', COUNT_BIG(*) AS 'COUNT_BIG' FROM Fact.[Order];
Kết quả:
+---------+-------------+ | COUNT | COUNT_BIG | |---------+-------------| | 231412 | 231412 | +---------+-------------+
Chúng ta có thể thấy rằng có 231412 hàng trong Fact. [Order] bảng.
Trong trường hợp này, cả hai hàm đều có thể xử lý vì số lượng hàng đủ nhỏ để được lưu trữ trong int cũng như bigint .
Tuy nhiên, nếu kết quả quá lớn đến mức int không thể lưu trữ nó, khi đó chúng tôi chỉ có thể sử dụng COUNT_BIG()
.
Ví dụ 2 - Khi COUNT_BIG () là bắt buộc
Dưới đây là ví dụ về nơi bạn cần sử dụng COUNT_BIG()
.
SELECT COUNT_BIG(*) AS 'Row Count' FROM ReallyBigTable;
Kết quả:
+-----------------+ | Row Count | |-----------------| | 9147483648 | +-----------------+
Trong trường hợp này, số hàng quá lớn đến mức int sẽ không thể xử lý nó. May mắn thay, chúng tôi có thể sử dụng COUNT_BIG()
, vì nó trả về kết quả là bigint .
Kiểm tra kiểu dữ liệu của cả hai hàm
Khi xem xét các ví dụ trước, chúng tôi thực sự không thể thấy tên loại dữ liệu. Chúng tôi chỉ có thể giả định rằng COUNT()
trả về kết quả của nó dưới dạng int và COUNT_BIG()
sử dụng bigint bởi vì đó là những gì tài liệu của Microsoft nói (mặc dù chúng tôi biết rằng ví dụ thứ hai không thể là int vì giá trị quá lớn đối với int ).
Chúng tôi có thể sử dụng sp_describe_first_result_set
thủ tục được lưu trữ để kiểm tra kiểu dữ liệu trả về từng hàm này.
Kiểm tra Loại dữ liệu cho COUNT ()
EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
Kết quả (sử dụng đầu ra dọc):
is_hidden | 0 column_ordinal | 1 name | NULL is_nullable | 1 system_type_id | 56 system_type_name | int max_length | 4 precision | 10 scale | 0 collation_name | NULL user_type_id | NULL user_type_database | NULL user_type_schema | NULL user_type_name | NULL assembly_qualified_type_name | NULL xml_collection_id | NULL xml_collection_database | NULL xml_collection_schema | NULL xml_collection_name | NULL is_xml_document | 0 is_case_sensitive | 0 is_fixed_length_clr_type | 0 source_server | NULL source_database | NULL source_schema | NULL source_table | NULL source_column | NULL is_identity_column | 0 is_part_of_unique_key | NULL is_updateable | 0 is_computed_column | 0 is_sparse_column_set | 0 ordinal_in_order_by_list | NULL order_by_is_descending | NULL order_by_list_length | NULL tds_type_id | 38 tds_length | 4 tds_collation_id | NULL tds_collation_sort_id | NULL
Có, chúng tôi không cần nhiều thông tin nhưng nếu bạn xem system_type_name , bạn sẽ thấy rằng giá trị của nó là int . Điều này cho chúng tôi biết rằng truy vấn của chúng tôi đã trả về kết quả dưới dạng int , như mong đợi. Bạn cũng có thể thấy rằng max_length và precision các giá trị nhất quán với int kiểu dữ liệu.
Kiểm tra Loại dữ liệu cho COUNT_BIG ()
Đối với ví dụ này, tất cả những gì chúng ta cần làm là thay thế COUNT(*)
với COUNT_BIG(*)
:
EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Kết quả (sử dụng đầu ra dọc):
is_hidden | 0 column_ordinal | 1 name | NULL is_nullable | 1 system_type_id | 127 system_type_name | bigint max_length | 8 precision | 19 scale | 0 collation_name | NULL user_type_id | NULL user_type_database | NULL user_type_schema | NULL user_type_name | NULL assembly_qualified_type_name | NULL xml_collection_id | NULL xml_collection_database | NULL xml_collection_schema | NULL xml_collection_name | NULL is_xml_document | 0 is_case_sensitive | 0 is_fixed_length_clr_type | 0 source_server | NULL source_database | NULL source_schema | NULL source_table | NULL source_column | NULL is_identity_column | 0 is_part_of_unique_key | NULL is_updateable | 0 is_computed_column | 0 is_sparse_column_set | 0 ordinal_in_order_by_list | NULL order_by_is_descending | NULL order_by_list_length | NULL tds_type_id | 38 tds_length | 8 tds_collation_id | NULL tds_collation_sort_id | NULL
Lần này, chúng ta có thể thấy rằng
system_type_name
là
bigint
. Điều này cho chúng tôi biết rằng COUNT_BIG()
của chúng tôi truy vấn trả về kết quả dưới dạng bigint , như mong đợi.
max_length
và
precision
các giá trị cũng nhất quán với bigint kiểu dữ liệu.
Nhân tiện, một cách nhanh hơn để thực hiện việc trên là kết hợp cả hai hàm vào truy vấn khi gọi thủ tục được lưu trữ.
Như thế này:
EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Điều đó sẽ xuất ra hai hàng, một hàng cho mỗi chức năng trong SELECT
tuyên bố.