Sql server CF_SQL_十进制和CF_SQL_数字之间的细微差别

Sql server CF_SQL_十进制和CF_SQL_数字之间的细微差别,sql-server,coldfusion,qoq,Sql Server,Coldfusion,Qoq,CF\u SQL\u DECIMAL和CF\u SQL\u NUMERIC之间有什么细微差别?听起来他们都接受一个名为scale(per)的参数 如果我在查询中为其中一个提供一个整数,会有区别吗? 如果没有,哪一个更好 快一点吗 他们有不同的取整方法吗 我在查询查询(QoQ)和MS-SQL查询中都使用了这些属性。如果您想知道使用哪个cfsqltype,它由目标列的数据类型决定。您发布的链接来自文档的一个非常旧的版本。较新的包括一个。对于SQL Server,它列出了以下映射: 对于DECIM

CF\u SQL\u DECIMAL
CF\u SQL\u NUMERIC
之间有什么细微差别?听起来他们都接受一个名为
scale
(per)的参数

  • 如果我在查询中为其中一个提供一个整数,会有区别吗?
  • 如果没有,哪一个更好
  • 快一点吗
  • 他们有不同的取整方法吗

  • 我在查询查询(QoQ)和MS-SQL查询中都使用了这些属性。

    如果您想知道使用哪个
    cfsqltype
    ,它由目标列的数据类型决定。您发布的链接来自文档的一个非常旧的版本。较新的包括一个。对于SQL Server,它列出了以下映射:

    • 对于
      DECIMAL
      列,使用
      CF\u SQL\u DECIMAL
    • 对于
      NUMERIC
      列,使用
      CF\u SQL\u NUMERIC
    用法非常简单。只需提供
    和所需的
    刻度

        <cfqueryparam value="#someNumber#" scale="2" cfsqltype="cf_sql_decimal"> 
        ... OR ....
        <cfqueryparam value="#someNumber#" scale="2" cfsqltype="cf_sql_numeric"> 
    
    
    ... 或
    
    关于比例的说明:

    • 如果省略,则
      刻度默认为零(0)。这意味着所有的小数位都被删除了
    • 指定时,
      scale
      必须是大于零的整数,并且显然不应超过目标列的
      精度(存储的总位数)
    十进制和数字之间的细微差别是什么?

    从CF的角度来看,它们本质上是相同的。CFQueryparam只是验证输入(数字、范围内等),并将
    转换为对象。最后,它将SQL发送到数据库执行。这就是CF的参与程度。其余的由数据库处理。因此,任何行为细微差别都可能是特定于数据库/驱动程序的

    如果在查询中为其中一个提供整数,会有区别吗?他们有不同的取整方法吗?

    我认为没有一个全面的答案。总的来说,大多数数据库都有类似的十进制/数字数据类型处理。但是,具体细节可能因数据库/驱动程序而异。因此,您需要查看数据库的文档

    SQLServer的文档中说。(尽管在其他地方,他们区分说“功能上”等同)。因此,他们应该以同样的方式行事。我的看法是,如果一个回合,另一个也会,溢出的情况也是一样。有关详细信息,请参阅:

    • 默认情况下,SQL Server在将数字转换为精度和小数位数较低的十进制或数值时使用舍入。然而,如果
      SET ARITHABORT
      选项为
      ON
      ,SQL Server在 发生溢出。仅损失精度和比例不足以 提出错误

    • int
      smallint
      。。。无论是
      decimal
      还是
      numeric
      都可能导致溢出

    虽然在本例中您可能可以使用任一cfsqltype,但最好还是遵循API。使用映射到目标列的数据类型的
    cfsqltype

    在查询查询(QoQ)和MS-SQL查询中。


    QoQ与数据库查询完全不同。他们也知道有点。。。有时很古怪。您最好查看文档:

    感谢您有条理、深思熟虑的回复。不过,我仍然对舍入/截断感到困惑。你说它取决于数据库,但这是否意味着CF正在将刻度传递给db,并让它担心转换/截断/舍入?是的,数据库处理实际的舍入。(说到查询,CF的角色只不过是一个信使。它只是打包SQL,然后将所有内容交给数据库。之后,所有内容都由数据库/驱动程序控制)。如果在DSN中启用日志记录,则可以看到此操作。运行一个简单的查询,如
    SELECT AS DecimalValue
    (续)。日志将显示CF实际将完整值传递给数据库/驱动程序
    spy(..)>>x=150.698634561297
    。然后,数据库执行sql并最终将取整后的结果
    150.70
    返回给CFC。感谢您的帮助。我不是数据库架构师,所以我可能永远也不会意识到我可以记录它并检查它。非常感谢!欢迎:)Dsn日志记录与a相结合是学习查询准备和执行的好工具。