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 上进行了复制。
为什么跟踪中的代码能够无错误地执行,但是当我将相同的代码复制/粘贴到 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 调用,将具有正确类型的正确参数传递给函数调用。因此,当应用程序成功调用时,从来没有从文本字符串到类型的转换numeric。float