【问题标题】:sql function throwing error when one of its parameters range is differentsql函数在其参数范围之一不同时抛出错误
【发布时间】:2023-03-22 03:02:02
【问题描述】:

我有一个使用动态查询运行的 sql 函数。

动态查询是:

exec sp_executesql N'SELECT * 
                       FROM Client_Report_Consol_Summary_RELATED1(@p11,@p12,@p13,@p14)
                      WHERE (WEEKNUM = @p4) AND  (YEAR = @p5) 
                   ORDER BY ProductDescription,ISSUE_DESC,ConsigneeFullName',
N'@p11 uniqueidentifier,
@p12 nvarchar(4000),
@p13 nvarchar(4000),
@p14 nvarchar(4000),
@p4 decimal(1,0),
@p5 decimal(4,0)',
@p11='F312F49B-203E-4BBA-A74E-82EA356ED6D3',
@p12=NULL,
@p13=N'',
@p14=N'',
@p4=1,      <-- seems to be the issue
@p5=2011

当我运行上面我得到以下错误 将 varchar 转换为数字数据类型时出现算术溢出错误。

但是当我编辑我的动态查询并将“@p4 decimal(1,0)”更新为“@p4 decimal(2,0)”时,它工作正常.

请任何人解释一下为什么会发生这种情况。

谢谢 阿米特

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您的函数中的 WEEKNUM 列是一个字符串 - SQL Server 正在尝试将其转换为数字类型,以便执行比较。因此,您要么需要将参数作为 (n)varchar 传递,以便进行字符串比较,要么使用您已经拥有的修复程序 - 使您的数字参数足够大以容纳将来自此函数的任何 WEEKNUM 值。

    我首先创建了一个将 WEEKNUM 作为 int 返回的虚拟函数,但无法重现问题。下面的函数确实演示了这个问题:

    create function Client_Report_Consol_Summary_RELATED1 (
        @p11 uniqueidentifier,
    @p12 nvarchar(4000),
    @p13 nvarchar(4000),
    @p14 nvarchar(4000)
    )
    returns table
    as
        return (select '22' as WEEKNUM, 2011 as YEAR, 1 as ProductDescription,1 as ISSUE_DESC, 1 as ConsigneeFullName
        )
    go
    

    【讨论】:

      【解决方案2】:

      当您的类型转换为数值类型时出现数据丢失时会发生此错误。比如——

      如果您的 varchar 字段的值为“123”并且您正试图将其转换为 DECIMAL(1,0),那么它显然无法保存完整的 123 值。因此它会抛出上述错误。

      【讨论】:

      • Sachin,我同意你的观点,但我只是将“1”作为值传递给我的@p4 变量,我认为这应该没问题。请指教
      • @Amit - 我尝试使用 DECIMAL(1,0) 将值 1 插入列中,并且效果很好。我不确定为什么它不适用于您的情况。理想情况下应该。尝试@p4 = CAST('1' as DECIMAL(1,0))
      • 这是从 WEEKNUM 列中的函数出来的字符串未能转换为十进制(1,0)
      • @Damien_The_Unbeliever - 是的。你说的对。现在我也明白了。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 2013-11-18
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多