Sql Server SOMME fonction de l'Int et la Conversion Décimal
Récemment, j'ai été Jouer avec des types de données SQL Server, et un Grand nombre de données dans la table et essayer de comprendre la Performance avec Varchar et des données Numériques. Mais, j'ai eu quelques erreurs, ce qui est je ne pense pas, il ne faut pas, mais il est. Mon problème est ci-dessous :
J'ai une table :
create table sa(f1 varchar(100))
J'ai une Procédure Stockée qui Insère 100000 données dans la table :
create proc sad
as
begin
declare @i int=0
while @i<100000
begin
insert into sa values(@i)
set @i=@i+1
end
end
exec sad
Et j'ai testé le suivant :
select CONVERT(int,f1) from sa //Works Fine, i tested after the Problem
select sum(convert(int,f1)) from sa //Didn't Worked, So i tested above and Below
select sum(convert(decimal(18,2),f1)) from sa //And, it again works fine
Mais, Quand j'somme de Conversion F1 Int, il m'indique une erreur.
Mais, quand je ne sélectionnez la Conversion de Int sa belle.
Et, quand je les somme de Conversion F1 à virgule, il fonctionne très bien.
Ce que la SOMME de la fonction de type de données?
Sur les données ci-Dessus, il fonctionne bien avec Décimale, mais pas Int?
Pourquoi?
Im Obtenir l'erreur Suivante
Erreur de dépassement arithmétique expression de conversion de type de données int.
- S'il vous plaît copiez et collez l'erreur que vous obtenez...
- Désolé...j'ai édité ma question avec l'erreur que j'ai obtenu
- J'essayais de trouver les problèmes de Performances, lors de l'Utilisation de type Varchar et Numérique-type de données
- Pourrait la valeur de votre somme doit être supérieur à 2 milliards de dollars?
- Déjà, il est 4999950000.00 qui conversion en Décimal je peux voir. Mais, la SOMME de la fonction de type de données a également converti en INT alors?
- Si vous additionnez
int
, SOMME sera uneint
mais si vous additionnezdecimal
, SOMME sera unedecimal
. Pour plus de détails, voir ma réponse ci-dessous... - Avez-vous d'obtenir toutes les informations dont vous avez besoin pour répondre à la q?
Vous devez vous connecter pour publier un commentaire.
Selon MS documentation (voir https://docs.microsoft.com/en-us/sql/t-sql/functions/sum-transact-sql), le
SUM()
fonction retourne les valeurs d'un type différent, selon le type de données de la colonne que vous ajoutez: si la colonne est de typeint
,tinyint
, ousmallint
, alors la SOMME des rendements des valeurs de typeint
.La conversion à
bigint
oudecimal
faitSUM()
retour d'un plus grand type de données, ce qui explique pourquoi, dans ce cas, vous n'avez pas de débordement.Vous êtes à la sommation que
INT
qui dispose d'une gamme qui ne peut pas retenir cette somme.La
DECIMAL
peut.La somme de toutes les valeurs de 1 à 99999 est 4999950000, le maximum de valeur INT 2 147 483 647, moins de la moitié de ce que la somme finit.
Lorsque vous INT somme, vous êtes l'obtention d'un nouvel INT. Lorsque vous êtes en additionnant DÉCIMAL, vous êtes l'obtention d'un nouvel DÉCIMAL, donc l'entrée type définit le type de sortie.
Vous pouvez passer à l'utilisation de
bigint
au lieu de cela, et il doit être "beaux".Aussi, sur une deuxième note, s'il vous plaît ne pas stocker des nombres sous forme de texte!
Attendons de vous que vous avez dépassé le maximum
int
de valeur que SQL Server permet (de 2 147 483 647) - voir https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql.Décimal permet une mesure de la limite supérieure de 10^38 - 1 (c'est à dire 1 avec 38 zéros après) - voir https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql.
Toutefois, si les valeurs sont de type
int
, je ne recommanderais pas de conversion àdecimal
.Decimal
valeurs sont utiles lorsque vous avez des chiffres avec possibilité de chiffres après la virgule avec une précision et l'échelle (par exemple pour des devises, des pourcentages, etc.) Comme une autre affiche a suggéré, la meilleure conversion serait ici unbigint
:Ressemble au votre, résultant de la somme est trop importante pour la
int
, utilisezbigint
, vérifiez également int, bigint, smallint, tinyint (Transact-SQL)