我有一个查询,该查询是通过扩展事件会话使用如下所示的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。
为什么跟踪中的代码能够执行而不会出错,但是当我将同一代码复制/粘贴到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调用,并将具有正确类型的正确参数传递给函数调用。所以,从没有从文本字符串转换numeric
或float
类型时的申请而作出此调用成功。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句