Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/04/2011, 15h48   #1
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
Par défaut Erreur sur le type de donnée lors d'éxécution d'une SP

RAISERROR(N'Too many di
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 17h37   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 07h35   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 668
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 668
Points : 8 718
Points : 8 718
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 :
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 09h57   #4
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
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
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 10h22   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Vous pouvez passer vos INT en BIGINT
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 14h33   #6
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
j'ai mis bigint et ça marche pas c toujours la même erreur.
j'ai même changé en decimal mais pareil
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 15h05   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 16h10   #8
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
merci beaucoup^

c'est lors de l'insertion que j'ai pas changé le type.
merci
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h23.


 
 
 
 
Partenaires

Hébergement Web