Error de desbordamiento aritmético
Resuelto
pinko_01
Mensajes publicados
2
Fecha de registro
Estado
Miembro
Última intervención
-
pinko_01 Mensajes publicados 2 Fecha de registro Estado Miembro Última intervención -
pinko_01 Mensajes publicados 2 Fecha de registro Estado Miembro Última intervención -
Bonjour, je travaille avec las procedimientos almacenados en SQL Server 2008, pero cuando intento ejecutar uno de mis procedimientos, me muestra el siguiente error :
Ha ocurrido un error de desbordamiento aritmético al convertir la expresión en el tipo de datos int.
[CODE]
USE [Entreprise]
GO
/****** Objeto: Procedimiento Almacenado [dbo].[Cos_phi_calculé] Fecha del Script: 06/12/2010 11:21:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Cos_phi_calculé]
AS
SELECT dbo.CosPhi_calcule(consomm_HC, consomm_HP, consomm_HN, consomm_energie_reactive)
FROM dbo.Facture
[/CODE]
De hecho, tengo una función llamada [dbo].[CosPhi_calcule] que devuelve un valor de tipo float, cuando quiero recuperarlo con mi procedimiento almacenado [dbo].[Cos_phi_calculé] me muestra el error mencionado anteriormente.
[CODE]
ALTER FUNCTION [dbo].[CosPhi_calcule]
(
@consomm_HC int,
@consomm_HP int,
@consomm_HN int,
@consoER int
)
RETURNS float
AS
BEGIN
DECLARE @resultat float
SET @resultat=(@consomm_HC+@consomm_HP+@consomm_HN)/(SQRT(((@consomm_HC+@consomm_HP+@consomm_HN)*(@consomm_HC+@consomm_HP+@consomm_HN)) + (@consoER * @consoER)))
RETURN @resultat
END
[/CODE]
En los parámetros de mi procedimiento, encuentro esto:
[IMG]http://www.easy-upload.net/fichier.php?fichier=2010612123640[/IMG]
Como pueden ver, mi procedimiento siempre devuelve un valor de tipo entero, y creo que esa es la única razón por la cual me muestra el mensaje de desbordamiento.
Entonces, he modificado el tipo de retorno de mi función y puse int en lugar de float para que mi procedimiento pudiera capturar el valor de la función, pero desgraciadamente en vano, me muestra el mismo error.
También tengo este código:
[CODE]
USE [Entreprise]
GO
[B]DECLARE @return_value int[/B]
EXEC @return_value = [dbo].[Cos_phi_calculé]
SELECT 'Valor de Retorno' = @return_value
GO
[/CODE]
Aquí también he reemplazado int por float para remediar el problema de conversión pero en vano ::cry:
Entonces, ¿hay alguna manera de modificar el tipo de retorno de mi procedimiento, haciéndolo float en lugar de int, porque int es dado por defecto por SQL Server?
Espero que he explicado bien mi problema y sus comentarios serán bienvenidos.
Gracias de antemano :)
Ha ocurrido un error de desbordamiento aritmético al convertir la expresión en el tipo de datos int.
[CODE]
USE [Entreprise]
GO
/****** Objeto: Procedimiento Almacenado [dbo].[Cos_phi_calculé] Fecha del Script: 06/12/2010 11:21:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Cos_phi_calculé]
AS
SELECT dbo.CosPhi_calcule(consomm_HC, consomm_HP, consomm_HN, consomm_energie_reactive)
FROM dbo.Facture
[/CODE]
De hecho, tengo una función llamada [dbo].[CosPhi_calcule] que devuelve un valor de tipo float, cuando quiero recuperarlo con mi procedimiento almacenado [dbo].[Cos_phi_calculé] me muestra el error mencionado anteriormente.
[CODE]
ALTER FUNCTION [dbo].[CosPhi_calcule]
(
@consomm_HC int,
@consomm_HP int,
@consomm_HN int,
@consoER int
)
RETURNS float
AS
BEGIN
DECLARE @resultat float
SET @resultat=(@consomm_HC+@consomm_HP+@consomm_HN)/(SQRT(((@consomm_HC+@consomm_HP+@consomm_HN)*(@consomm_HC+@consomm_HP+@consomm_HN)) + (@consoER * @consoER)))
RETURN @resultat
END
[/CODE]
En los parámetros de mi procedimiento, encuentro esto:
[IMG]http://www.easy-upload.net/fichier.php?fichier=2010612123640[/IMG]
Como pueden ver, mi procedimiento siempre devuelve un valor de tipo entero, y creo que esa es la única razón por la cual me muestra el mensaje de desbordamiento.
Entonces, he modificado el tipo de retorno de mi función y puse int en lugar de float para que mi procedimiento pudiera capturar el valor de la función, pero desgraciadamente en vano, me muestra el mismo error.
También tengo este código:
[CODE]
USE [Entreprise]
GO
[B]DECLARE @return_value int[/B]
EXEC @return_value = [dbo].[Cos_phi_calculé]
SELECT 'Valor de Retorno' = @return_value
GO
[/CODE]
Aquí también he reemplazado int por float para remediar el problema de conversión pero en vano ::cry:
Entonces, ¿hay alguna manera de modificar el tipo de retorno de mi procedimiento, haciéndolo float en lugar de int, porque int es dado por defecto por SQL Server?
Espero que he explicado bien mi problema y sus comentarios serán bienvenidos.
Gracias de antemano :)
2 respuestas
Hola,
No conozco las sutilezas de SQL Server, pero la lectura de tu código me recordó algunos recuerdos desagradables.
La función SQRT devuelve un float, por lo que era preferible proporcionarle floats.
Por lo tanto, tiendo a aconsejarte que explores la siguiente vía:
* convertir explícitamente todos los int a float
* detallar cada cálculo
* convertir el resultado final a int
Si logras identificar el origen del error, puedes economizar conversiones y convertir solo la parte sensible.
No conozco las sutilezas de SQL Server, pero la lectura de tu código me recordó algunos recuerdos desagradables.
La función SQRT devuelve un float, por lo que era preferible proporcionarle floats.
Por lo tanto, tiendo a aconsejarte que explores la siguiente vía:
* convertir explícitamente todos los int a float
* detallar cada cálculo
* convertir el resultado final a int
Si logras identificar el origen del error, puedes economizar conversiones y convertir solo la parte sensible.