SQL Server浮动数据类型超出范围

JoeLeBaron:

我有一个查询,该查询是通过扩展事件会话使用如下所示的float数据类型捕获的:

@variable = 120700.8000000000000000000000000000000000000000000000

如果我尝试在SSMS中运行相同的查询,则会收到错误:数字'120700.8000000000000000000000000000000000000000000000000000'超出了数字表示形式的范围(最大精度38)。

就像你要跑步一样

DECLARE @variable float = 120700.8000000000000000000000000000000000000000000000

跟踪正在运行时,查询成功。该事件是rpc_completed事件,它具有持续时间,cpu,行数等。

不知道这是否相关,但是有问题的查询是exec sp_executeSQL。跟踪捕获的完整查询如下所示:

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

所以我的问题是,为什么跟踪中的代码能够无错误地执行,但是当我将同一代码复制/粘贴到SSMS时会引发错误。如果我使用相同的代码并删掉一堆零,那么它将起作用。

我在SQL Azure DB上运行。我已转载兼容性SQL2016,SQL2019和Prem SQL2019。

弗拉基米尔·巴拉诺夫(Vladimir Baranov):

为什么跟踪中的代码能够执行而不会出错,但是当我将同一代码复制/粘贴到SSMS时会引发错误。

当您将此查询放入SSMS时

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

文字120700.8000000000000000000000000000000000000000000000被解释为数字/十进制类型。引擎尝试将其转换为数字/十进制类型的值,但失败,因为数字的最大精度为38位。

如果您将此查询放入SSMS,它应该可以正常工作

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

E0在末尾添加了。

要生成float文字,我们需要使用科学符号,如常量(Transact-SQL)中所述


为什么跟踪中的代码能够正确执行

我不能肯定地说,但是我怀疑您在跟踪中看到的代码与应用程序发送到SQL Server的代码不完全相同。它的发送方式可能是参数类型和值实际上是float,而不是带有所有这些零的文本字符串。

我认为,应用程序可能会进行RPC调用,并将具有正确类型的正确参数传递给函数调用。所以,从没有从文本字符串转换numericfloat类型时的申请而作出此调用成功。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Laravel与SQL Server 2008抛出“将varchar数据类型转换为日期时间数据类型导致值超出范围”

SQL Server代理中的错误:“将varchar数据类型与日期时间数据类型进行对话导致超出范围。”

varchar数据类型到datetime数据类型的转换导致值超出范围。SQL服务器

sql 将 varchar 数据类型转换为超出范围的日期时间数据类型

SQL Server浮动数据类型行为

显示浮动SQL数据类型

SQL Server 日期时间超出范围问题

插入sql数据库时可能超出范围

通过链接服务器在 SQL Server 中导入 OLAP 元数据会导致日期超出范围

Microsoft SQL Server 2012的新身份跳转功能如何处理数据类型范围?

了解SQL Server Int数据类型

SQL Server更改主键数据类型

使用SQL Server地理数据类型

SQL Server:地理数据类型:GeomFromGml

SQL异常:索引超出范围

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

PYODBC 错误:SQL 数据参数超出范围 (30030)(SQL 绑定参数)

SQL Server 2012日期时间比较中的超出范围的值

SQL Server:在插入/更新时,如何自动调整列的超出范围的值?

十进制SQL Server EF C#的参数超出范围异常

SQL Server文本类型与varchar数据类型

保留从数据帧到SQL Server表的数据类型

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围异常

从datetime2数据类型到datetime数据类型的转换导致超出范围的值

varchar数据类型到datetime数据类型的转换导致超出范围的值MVC5中的错误

将datetime2数据类型转换为datetime数据类型会导致超出范围的值

datetime2数据类型转换为datetime数据类型导致超出范围的值

Azure MSSQL - 将 nvarchar 数据类型转换为日期时间数据类型导致值超出范围

从nvarchar数据类型到datetime数据类型的转换导致C#中的值超出范围