Saltar al contenido

Tipo de datos flotante de SQL Server fuera de rango

Traemos la mejor información que encontramos en todo internet. Nuestro deseo es que te sea de mucha utilidad y si deseas compartir algo que nos pueda ayudar a perfeccionar nuestra información siéntete libre de hacerlo..

Solución:

El string literal 120700.8000000000000000000000000000000000000000000000 primero se convierte implícitamente a decimal, de ahí el error.

Tratar

DECLARE @variable float = 120700.8000000000000000000000000000000000000000000000E0

Fuente: TSQL: crea un valor flotante literal

¿Por qué el código en el seguimiento puede ejecutarse sin error, pero cuando copio/pego ese mismo código en SSMS arroja un error?

Cuando pones esta consulta en SSMS

exec sp_executeSQL N'SELECT
    col1,
    col2
FROM table
WHERE col3 > @variable', N'@variable float', 
@variable = 120700.8000000000000000000000000000000000000000000000

el literal 120700.8000000000000000000000000000000000000000000000 se interpreta como un tipo numérico/decimal. El motor intenta convertirlo a un valor de tipo numérico/decimal y falla, porque el numérico tiene una precisión máxima de 38 dígitos.

Si coloca esta consulta en SSMS, debería funcionar

exec sp_executeSQL N'SELECT
    col1,
    col2
FROM table
WHERE col3 > @variable', N'@variable float', 
@variable = 120700.8000000000000000000000000000000000000000000000E0

he añadido E0 al final.

para hacer el float literal necesitamos usar la notación científica, como se documenta en Constants (Transact-SQL)


¿Por qué el código en el seguimiento puede ejecutarse sin error?

No puedo asegurarlo, pero sospecho que el código que ve en el seguimiento no es exactamente el mismo código que la aplicación envió al servidor SQL. Podría haberse enviado de tal manera que el tipo y el valor del parámetro fueran realmente float, no es un texto string con todos estos ceros.

Creo que es probable que la aplicación realice una llamada RPC pasando el parámetro adecuado con el tipo adecuado a la llamada de función. Entonces, nunca hubo una conversión de un texto string a numeric o float escriba cuándo una aplicación realizó esta llamada con éxito.

Detalles sobre lo que hice para probar la respuesta aceptada anterior.

Estaba tomando la declaración de seguimiento y reproduciéndola en otra base de datos usando C# de esta manera (esto arrojará el error de fuera de rango):

cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "exec sp_executesql @stmt=N'SELECT @f',
    @params=N'@f float',@f=120700.800000000002910383045673370361328125";
cmd.ExecuteNonQuery();

Lo que debo hacer es extraer esas partes y crear un procedimiento almacenado con parámetros como este:

cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "sp_executesql";

SqlParameter p1 = new SqlParameter();
p1.DbType = System.Data.DbType.String;
p1.ParameterName = "@stmt";
p1.Value = "SELECT @f";

SqlParameter p2 = new SqlParameter();
p2.DbType = System.Data.DbType.String;
p2.ParameterName = "@params";
p2.Value = "@f float";

SqlParameter p3 = new SqlParameter();
p3.DbType = System.Data.DbType.Double;
p3.Value = 120700.8000000000000000000000000000000000000000000000;
p3.ParameterName = "@f";

cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);

cmd.ExecuteNonQuery();

Cuando ejecuto eso, aparece en el seguimiento como:

exec sp_executesql @stmt=N’SELECT @f’,@params=N’@f float’,@f=120700.800000000002910383045673370361328125

Entonces, el problema es que no puedo simplemente tomar la declaración de un evento rpc_completed. Necesito analizarlo y reconstruir el procedimiento almacenado explícitamente.

Aquí tienes las reseñas y valoraciones

Si posees algún reparo o forma de progresar nuestro crónica te invitamos realizar un exégesis y con deseo lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *