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

Joe*_*ron 10 sql-server precision sqldatatypes

我有一个查询,我通过扩展事件会话捕获了一个浮点数据类型,如下所示:

@variable = 120700.8000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

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

就像你要跑步一样

DECLARE @variable float = 120700.8000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

跟踪运行时查询成功。事件是 rpc_completed 并且它具有持续时间、CPU、行数等...

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

exec sp_executeSQL N'SELECT
    col1,
    col2
FROM table
WHERE col3 > @variable', N'@variable float', 
@variable = 120700.8000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

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

我在 SQL Azure DB 上运行。我已经在兼容性 SQL2016、SQL2019 和 Prem SQL2019 上进行了复制。

Vla*_*nov 3

为什么跟踪中的代码能够无错误地执行,但是当我将相同的代码复制/粘贴到 SSMS 时,它会抛出错误。

当您将此查询放入 SSMS 中时

exec sp_executeSQL N'SELECT
    col1,
    col2
FROM table
WHERE col3 > @variable', N'@variable float', 
@variable = 120700.8000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

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

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

exec sp_executeSQL N'SELECT
    col1,
    col2
FROM table
WHERE col3 > @variable', N'@variable float', 
@variable = 120700.8000000000000000000000000000000000000000000000E0
Run Code Online (Sandbox Code Playgroud)

E0在最后添加了。

为了生成float文字,我们需要使用科学记数法,如常量 (Transact-SQL)中所述


为什么trace中的代码能够无错误地执行

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

我认为,应用程序可能会进行 RPC 调用,将具有正确类型的正确参数传递给函数调用。因此,当应用程序成功调用时,从来没有从文本字符串到类型的转换numericfloat