I SQL Server er COUNT_BIG()
funktionen og COUNT()
gør stort set det samme:returner antallet af genstande fundet i en gruppe. Grundlæggende kan du bruge disse funktioner til at finde ud af, hvor mange rækker der er i en tabel eller et resultatsæt.
I mange tilfælde vil du være i stand til at vælge den, du foretrækker. Der er dog en forskel mellem disse to funktioner, der kan diktere, at du skal bruge den ene frem for den anden.
Forskellen er, at COUNT()
returnerer sit resultat som en int , hvorimod COUNT_BIG()
returnerer sit resultat som en bigint .
Med andre ord skal du bruge COUNT_BIG()
hvis du forventer, at resultaterne er større end 2.147.483.647 (dvs. hvis forespørgslen returnerer mere end 2.147.483.647 rækker).
Eksempel 1 – Når COUNT() er OK
Her er et grundlæggende eksempel, der viser et scenarie, hvor både COUNT()
og COUNT_BIG()
kan bruges:
USE WideWorldImportersDW; SELECT COUNT(*) AS 'COUNT', COUNT_BIG(*) AS 'COUNT_BIG' FROM Fact.[Order];
Resultat:
+---------+-------------+ | COUNT | COUNT_BIG | |---------+-------------| | 231412 | 231412 | +---------+-------------+
Vi kan se, at der er 231412 rækker i Fakta.[Order] tabel.
I dette tilfælde kan begge funktioner håndtere det, fordi rækkeantallet er lille nok til at blive gemt i en int samt en bigt .
Men hvis resultatet var så stort, at en int ikke kunne gemme det, så ville vi kun være i stand til at bruge COUNT_BIG()
.
Eksempel 2 – Når COUNT_BIG() er påkrævet
Her er et eksempel på, hvor du skal bruge COUNT_BIG()
.
SELECT COUNT_BIG(*) AS 'Row Count' FROM ReallyBigTable;
Resultat:
+-----------------+ | Row Count | |-----------------| | 9147483648 | +-----------------+
I dette tilfælde er rækkeantallet så stort, at en int ikke ville kunne klare det. Heldigvis kan vi bruge COUNT_BIG()
, fordi den returnerer sit resultat som en bigint .
Kontrol af datatypen for begge funktioner
Når vi ser på de foregående eksempler, kan vi faktisk ikke se datatypens navn. Vi kan kun antage, at COUNT()
returnerer sine resultater som en int og COUNT_BIG()
bruger bigt fordi det er, hvad Microsoft-dokumentationen siger (selvom vi ved, at det andet eksempel ikke kunne være en int fordi værdien er for stor til en int ).
Vi kan bruge sp_describe_first_result_set
gemt procedure for at kontrollere returneringsdatatypen for hver af disse funktioner.
Tjek datatypen for COUNT()
EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
Resultat (ved hjælp af lodret output):
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
Ja, der er mange oplysninger, vi ikke har brug for, men hvis du ser på system_type_name kolonne, vil du se, at dens værdi er int . Dette fortæller os, at vores forespørgsel returnerede sine resultater som en int , som forventet. Du kan også se, at max_length og præcision værdier stemmer overens med int datatype.
Tjek datatypen for COUNT_BIG()
For dette eksempel er alt, hvad vi skal gøre, at erstatte COUNT(*)
med COUNT_BIG(*)
:
EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Resultat (ved hjælp af lodret output):
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
Denne gang kan vi se det
system_type_name
er
stor
. Dette fortæller os, at vores COUNT_BIG()
forespørgslen returnerede sine resultater som en bigint , som forventet.
max_length
og
præcision
værdier er også i overensstemmelse med bigint datatype.
Forresten, en hurtigere måde at gøre ovenstående på er at kombinere begge funktioner i forespørgsel, når du kalder den lagrede procedure.
Sådan:
EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Det vil udlæse to rækker, en for hver funktion i SELECT
erklæring.