IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Erreur sur le type de donnée lors d'éxécution d'une SP


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut Erreur sur le type de donnée lors d'éxécution d'une SP
    RAISERROR(N'Too many di

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous devez avoir le résultat d'une somme de INT qui dépasse la limite pour un INT, à savoir 2^32 (2147483648 pour être précis )
    Attention cela peut être aussi dans des résultat intermédiaires de calcul...


    Executez le code de votre SP directement, vous aurez au moins la ligne qui pose problème !

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    En plus de ce que vous a conseillé aieeeuuuuu, vous n'avez aucun besoin de tables temporaires.
    On peut ainsi réécrire votre procédure stockée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    ALTER PROCEDURE [dbo].[sp_GA_ASSET_VALUES_01]	
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE	@StartDate datetime
    		, @BDD_TF sysname
    		, @BDD_DW sysname
    		, @sql nvarchar(max)
    		---
    		, @ExecutionId int
    		, @RuleTypeCode nvarchar(max)
    		, @Actif_TF_CountLine decimal(18,7)
    		, @Actif_TF_Fin_CountLine decimal(18,7)
    		, @DIFF01_ASSET_VALUES_01 varchar(32) -- Peut-être d'un autre type
    		, @DIFF02_ASSET_VALUES_01 varchar(32) -- Peut-être d'un autre type
     
    	SELECT	@StartDate = GETDATE()
    		, @BDD_TF = dbo.fn_GetTransfertDatabase()
    		, @BDD_DW = dbo.fn_GetDWHDatabase() 
     
    	SELECT	@DIFF01_ASSET_VALUES_01 = ParameterValue 
    	FROM	dbo.ReperesLoadRuleParameters 
    	WHERE	ParameterCode = 'DIFF01_ASSET_VALUES_01'
     
    	SELECT	@DIFF02_ASSET_VALUES_01 = ParameterValue 
    	FROM	dbo.ReperesLoadRuleParameters
    	WHERE	ParameterCode = 'DIFF02_ASSET_VALUES_01'
     
    	-- Récupération de l'identifiant d'exécution
    	SET	@sql = 'SELECT @ExecutionId = MAX(RLE.ExecutionId)'
    			+ 'FROM [' + @BDD_DW + '].dbo.ReperesLoadExecutions RLE'
    			+ 'JOIN ['+@BDD_DW+'].dbo.ReperesLoadProcesses RLP ON RLE.LoadProcessId = RLP.LoadProcessId'
    			+ 'WHERE RLP.ProcessCode = ''CHG_DTM_GA'''
     
    	EXEC	sp_executeSQL
    			@sql
    			, '@ExecutionId int OUTPUT'
    			, @ExecutionId = @ExecutionId OUTPUT
     
    	-- Récupération du niveau de criticité
    	SET	@sql = 'SELECT	@RuleTypeCode = RuleTypeCode'
    			+ 'FROM [' + @BDD_DW + '].dbo.ReperesLoadRules'
    			+ 'WHERE RuleCode = ''ASSET_VALUES_01'''
     
    	EXEC	sp_executeSQL
    			@sql
    			, '@RuleTypeCode nvarchar(max) OUTPUT'
    			, @RuleTypeCode = @RuleTypeCode OUTPUT
     
    	-- Récupération de @Actif_TF_CountLine 	
    	SET	@sql = 'SELECT @Actif_TF_CountLine = SUM(AverageAssetValueEUR)'
    			+ 'FROM [' + @BDD_TF + '].dbo.MonthlyAssetValues'
     
    	EXEC	sp_executeSQL
    			@sql
    			, '@Actif_TF_CountLine decimal(18,7) OUTPUT'
    			, @Actif_TF_CountLine = @Actif_TF_CountLine OUTPUT
     
    	-- Récupération de @Actif_TF_Fin_CountLine
    	SET	@sql = 'SELECT @Actif_TF_Fin_CountLine = SUM(EndPeriodAssetValueEUR)'
    			+ 'FROM [' + @BDD_TF + '].dbo.MonthlyAssetValues'
     
    	EXEC	sp_executeSQL
    			@sql
    			, '@Actif_TF_Fin_CountLine decimal(18,7) OUTPUT'
    			, @Actif_TF_Fin_CountLine = @Actif_TF_Fin_CountLine OUTPUT
     
    	-- Vérification de l'écart...	
    	SELECT @Result = dbo.fn_ER
    			(
    				@Actif_TF_Fin_CountLine
    				, @Actif_TF_CountLine
    				, @DIFF01_ASSET_VALUES_01
    				, @DIFF02_ASSET_VALUES_01
    			)
     
    	SET	@ResultStatus = LEFT(@Result, CHARINDEX('_', @Result) - 1)
    	SET	@ResultValue = CAST(RIGHT(@Result, LEN(@Result) - CHARINDEX('_', @Result)) AS decimal(18,2))
     
     
    	-- Si ERROR et niveau de criticité BLOQUANT alors...
    	IF 
    	(
    		@ResultStatus = 'ERROR'
    		AND @RuleTypeCode = 'BLOQUANT'
    	)
    	BEGIN
    		-- Insertion dans la table ReperesLoadExecutionResults...
    		INSERT	dbo.ReperesLoadExecutionResults
    		(	
    			ExecutionId
    			, RuleId
    			, ResultStatusCode
    			, ResultMessage
    			, ResultDetail
    			, StartDate
    			, EndDate 
    		)
    		SELECT	@ExecutionId
    			, RuleId
    			, @ResultStatus
    			, REPLACE(REPLACE(REPLACE(AlertMessage,'#{N1}',@Actif_TF_CountLine),'#{N0}',@Actif_TF_Fin_CountLine),'#{diff_pct*100}',CAST(@ResultValue*100. AS nvarchar(max))) AlertMessage
    			, ActionMessage
    			, @StartDate
    			, GETDATE() 
    		FROM	dbo.ReperesLoadRules
    		WHERE	RuleCode = 'ASSET_VALUES_01'
     
    		-- Sortie en erreur
    		RAISERROR(N'Too many difference between Intruments number in TF and DW!', 16, 1)		
    	END
     
    	-- Si WARNING et niveau de criticité BLOQUANT, ou WARNING/ERROR et niveau de criticité NON-BLOQUANT) alors...
    	IF 
    	(
    		(
    			@ResultStatus = 'WARNING'
    			AND @RuleTypeCode IN('BLOQUANT', 'NON-BLOQUANT')
    		)
    		OR
    		(
    			@ResultStatus = 'ERROR'
    			AND @RuleTypeCode = 'NON-BLOQUANT'
    		)
    	)
    	BEGIN
    		-- Insertion dans la table ReperesLoadExecutionResults...
    		INSERT	dbo.ReperesLoadExecutionResults
    		( 
    			ExecutionId
    			, RuleId
    			, ResultStatusCode
    			, ResultMessage
    			, ResultDetail
    			, StartDate
    			, EndDate 
    		)
    		SELECT	@ExecutionId
    			, RuleId
    			, @ResultStatus
    			, REPLACE(REPLACE(REPLACE(AlertMessage,'#{N1}',@Actif_TF_CountLine),'#{N0}',@Actif_TF_Fin_CountLine),'#{diff_pct*100}',CAST(@ResultValue*100. AS nvarchar(max))) AlertMessage
    			, ActionMessage
    			, @StartDate
    			, GETDATE() 
    		FROM	dbo.ReperesLoadRules
    		WHERE	RuleCode = 'ASSET_VALUES_01'
    	END
    	-- Si OK ou bien niveau de criticité "PASSANT" alors...
    	ELSE IF (@ResultStatus = 'OK' OR @RuleTypeCode = 'PASSANT')
    	BEGIN
    		-- Insertion dans la table ReperesLoadExecutionResults...
    		INSERT	dbo.ReperesLoadExecutionResults
    		(
    			ExecutionId
    			, RuleId
    			, ResultStatusCode
    			, ResultMessage
    			, ResultDetail
    			, StartDate
    			, EndDate 
    		)
    		SELECT	  @ExecutionId
    			, RuleId
    			, 'OK'
    			, '' AlertMessage
    			, '' ActionMessage
    			, @StartDate
    			, GETDATE() 
    		FROM	dbo.ReperesLoadRules
    		WHERE	RuleCode = 'ASSET_VALUES_01'
    	END
    END
    Considérer qu'une table ne contient qu'une seule valeur dans une seule colonne est faux.
    En plus de cela vous recourez à TempDB, qui n'en a pas besoin

    Enfin, une parenthèse sur deux dans vos IF ne sert à rien à part diminuer la lisibilité de votre code

    @++

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut
    bonjour;

    oui c'est la somme qui pose problème mais je vois pas comment contourner le problème.
    je dois changer le type ou faire quoi ?

    merci d'avance

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Vous pouvez passer vos INT en BIGINT

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut
    j'ai mis bigint et ça marche pas c toujours la même erreur.
    j'ai même changé en decimal mais pareil

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Si vous avez toujours la même erreur, c'est que vous n'avez pas changé au bon endroit !

    Attention, si vous insérez ces sommes par la suite, la colonne cible doit être en BIGINT également !

    L'erreur peut aussi venir des UDF que vous utilisez...

    localisez plus précisément d'où vient l'erreur, car avec si peu d'informations, on ne peut pas vous dire grand chose de plus...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut
    merci beaucoup^

    c'est lors de l'insertion que j'ai pas changé le type.
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur ORA-00932 types de données incohérents
    Par paradeofphp dans le forum Oracle
    Réponses: 7
    Dernier message: 21/05/2007, 10h56
  2. Erreur sur inclusion types.h avec cygwin
    Par Bayard dans le forum Réseau
    Réponses: 12
    Dernier message: 12/11/2006, 16h48
  3. [SQL 2000] Question sur les types de données
    Par Angath dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/11/2006, 14h05
  4. erreur sur le type de champ
    Par samsso2006 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 02/11/2006, 10h41
  5. Erreur sur récupération type d'input
    Par michaelbob dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/08/2006, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo