如果您想知道cfsqltype
使用哪个,它由目标列的数据类型决定。您发布的链接来自文档的非常旧版本。较新的包括大多数主要数据库的矩阵。对于 SQL Server,它列出了以下映射:
- 对于
DECIMAL
列使用CF_SQL_DECIMAL
- 对于
NUMERIC
列使用CF_SQL_NUMERIC
用法非常简单。只需提供value
和期望scale
:
<cfqueryparam value="#someNumber#" scale="2" cfsqltype="cf_sql_decimal">
... OR ....
<cfqueryparam value="#someNumber#" scale="2" cfsqltype="cf_sql_numeric">
关于规模的注意事项:
- 如果省略,则
scale
默认为零 (0)。意味着所有小数位都被删除。
- 指定时,
scale
必须是大于零的整数,并且显然不应超过precision
目标列的(存储的总位数)
CF_SQL_DECIMAL 和 CF_SQL_NUMERIC 之间的细微差别是什么?
从 CF 的角度来看,它们本质上是相同的。CFQueryparam 只是验证输入(数字、范围内等),并将其转换value
为java.math.BigDecimal
对象。最后,它将 SQL 发送到数据库执行。这就是CF的参与程度。其余的由数据库处理。因此,任何行为细微差别都可能是特定于数据库/驱动程序的。
如果我要为查询中的任何一个提供一个整数,会有区别吗?他们有不同的舍入方法吗?
我认为没有一个全面的答案。总体而言,大多数数据库对十进制/数字数据类型的处理方式相似。但是,确切的详细信息可能会因您的数据库/驱动程序而异。因此,您需要查看数据库的文档。
SQL Server 的文档说“decimal
和numeric
类型彼此完全等价。(尽管在其他地方他们区分说“功能上”等价)。所以它们的行为方式应该相同。我的看法是,如果一轮,另一轮也一样,溢出也一样。有关更多详细信息,请参阅:十进制和数字(Transact-SQL)。
默认情况下,SQL Server 在将数字转换为精度和小数位数较低的小数或数值时使用舍入。但是,如果SET ARITHABORT
选项是ON
,则 SQL Server 会在发生溢出时引发错误。仅损失精度和规模不足以引发错误。
从int
, smallint
, ... 转换为decimal
ornumeric
会导致溢出。
虽然在这种情况下您可能可以使用任一 cfsqltype,但最好还是遵循 API。使用cfsqltype
which 映射到目标列的数据类型。
在查询的查询 (QoQ) 以及 MS-SQL 查询中。
QoQ 与数据库查询完全不同。众所周知,它们有时有点……古怪。最好的办法是查看文档:Query of Queries user guide