none
SQLSERVER 有多个除号的公式如何处理,谢谢! RRS feed

  • 问题

  • 假设公式为:A/B+C/(1+D)*(1-E/F),其中A\B\C\D\E\F都是某个表的字段,这种情况怎么处理除数为0的情况效率高?

    谢谢!

    2018年1月25日 8:25

全部回复

  • 判断 b<>0 and D<>-1 and F<>0

    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    2018年1月25日 8:45
  • 判断 b<>0 and D<>-1 and F<>0

    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    这个只是举例,实际上公式很多,这么处理很麻烦,我用下面的方式,查询可以

    SET ARITHABORT off
    SET ANSI_WARNINGS off
    SELECT 1/0

    但是在SELECT语句中加个into tb_xxx就出错了:

    消息 1934,级别 16,状态 1,过程 DDLTrigger_Table,行 18 [批起始行 14]
    INSERT 失败,因为下列 SET 选项的设置不正确: 'ANSI_WARNINGS'。请确保 SET 选项正确无误,可以用于 计算列上的索引视图和/或索引和/或筛选的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。。

    2018年1月25日 9:01
  • 给你一个歪招,就是做个判断,如果是0就改为-1,然后对结果是小于0的都重置成你需要的数或者0(我这里是0);


    family as water

    2018年1月25日 11:20
  • 字段不仅仅要处理零,还要处理NULL值的情况。

    简化公式,分段处理:

    A/B+C/(1+D)*(1-E/F), 增加临时变量

    x=(1+D), 

    y=(1-E/F)

    上面可以简化为A/B+C/x*y


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2018年1月26日 0:47
  • 判断 b<>0 and D<>-1 and F<>0


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    这个只是举例,实际上公式很多,这么处理很麻烦,我用下面的方式,查询可以

    SET ARITHABORT off
    SET ANSI_WARNINGS off
    SELECT 1/0

    但是在SELECT语句中加个into tb_xxx就出错了:

    消息 1934,级别 16,状态 1,过程 DDLTrigger_Table,行 18 [批起始行 14]
    INSERT 失败,因为下列 SET 选项的设置不正确: 'ANSI_WARNINGS'。请确保 SET 选项正确无误,可以用于 计算列上的索引视图和/或索引和/或筛选的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。。

    测试了没问题啊

    SET ARITHABORT off
    SET ANSI_WARNINGS off
    if object_id('tempdb..#t') is not null drop table #t
    SELECT 1/0 as a into #t
    select * from #t
    

    结果:

    Division by zero occurred.
    (1 行受影响)
    a
    -----------
    NULL
    (1 行受影响)

    2018年1月26日 1:13
  • 给你一个歪招,就是做个判断,如果是0就改为-1,然后对结果是小于0的都重置成你需要的数或者0(我这里是0);


    family as water


    那不行,偶数个怎么办?

    想不想时已是想,不如不想都不想。

    2018年1月26日 3:23
    版主
  • 判断 b<>0 and D<>-1 and F<>0


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    这个只是举例,实际上公式很多,这么处理很麻烦,我用下面的方式,查询可以

    SET ARITHABORT off
    SET ANSI_WARNINGS off
    SELECT 1/0

    但是在SELECT语句中加个into tb_xxx就出错了:

    消息 1934,级别 16,状态 1,过程 DDLTrigger_Table,行 18 [批起始行 14]
    INSERT 失败,因为下列 SET 选项的设置不正确: 'ANSI_WARNINGS'。请确保 SET 选项正确无误,可以用于 计算列上的索引视图和/或索引和/或筛选的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。。

    测试了没问题啊

    SET ARITHABORT off
    SET ANSI_WARNINGS off
    if object_id('tempdb..#t') is not null drop table #t
    SELECT 1/0 as a into #t
    select * from #t

    结果:

    Division by zero occurred.
    (1 行受影响)
    a
    -----------
    NULL
    (1 行受影响)

    单独这么执行没问题,放到存储过程中就不行
    2018年1月26日 5:37
  • 在创建或修改 Transact-SQL 存储过程时,数据库引擎将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在创建或更改存储过程时不保存其他 SET 选项(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)。如果存储过程的逻辑取决于特定的设置,则应在过程开头添加一条 SET 语句,以确保设置正确。从存储过程中执行 SET 语句时,该设置只在存储过程完成之前有效。之后,设置将还原为调用存储过程时的值。这样一来,单个客户端就可以设置所需的选项,而不会影响存储过程的逻辑

    ---------------------

    参考联机帮助上的如上说明,你是放错位置了吧?

    2018年1月26日 6:14
  • 在创建或修改 Transact-SQL 存储过程时,数据库引擎将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在创建或更改存储过程时不保存其他 SET 选项(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)。如果存储过程的逻辑取决于特定的设置,则应在过程开头添加一条 SET 语句,以确保设置正确。从存储过程中执行 SET 语句时,该设置只在存储过程完成之前有效。之后,设置将还原为调用存储过程时的值。这样一来,单个客户端就可以设置所需的选项,而不会影响存储过程的逻辑

    ---------------------

    参考联机帮助上的如上说明,你是放错位置了吧?

    没放错位置,帮助文档中有这么说:

    在对计算列或索引视图创建或更改索引时,SET ARITHABORT 必须为 ON。 如果 SET ARITHABORT 为 OFF,则对包含计算列或索引视图索引的表执行 CREATE、UPDATE、INSERT 和 DELETE 语句时将失败。

    2018年1月26日 9:39
  • 那意思就是你真用到了不支持的场景?那就没招
    2018年1月29日 1:08