使用CAST和bigint

时间:2016-11-16 00:56:28

标签: sql-server

我试图理解这句话的作用

SUM(CAST(FILEPROPERTY(name, 'SpaceUsed') AS bigint) * 8192.)/1024 /1024

为什么8192之后会出现一个点?任何人都可以一点一点地解释这个问题。谢谢!

2 个答案:

答案 0 :(得分:2)

整数后面的点.将其隐式转换为十进制值。这很可能是强制输出也是十进制(不是整数)。在这种情况下,您只需要转换操作的一部分以强制输出为该类型。

这可能与字节/页面有关,因为数字81921024(最有可能转换为更大的单位)。也可以通过属性值来暗示这一点,该值表示文件使用了多少空间。

一个页面适合8kB,这意味着将页面值乘以8192会将输出转换为正在使用的字节。然后按1024两次成功将输出转换为千兆字节。

使用函数说明:

  • FILEPROPERTY返回存储在数据库中的文件名的值。如果文件不存在,则返回空值
  • CAST用于将值转换为bigint类型
  • SUM是查询中用于对指定组的值求和的汇总函数

答案 1 :(得分:2)

FILEPROPERTY()返回int值。请注意,SpaceUsed属性不是以字节为单位,而是在“页面” - and in SQL Server a page is 8KiB中,因此乘以8192以获得KiB的大小是合适的。

我以前从未遇到过没有小数位的尾随点 - the documentation for constants/literals in T-SQL没有给出这种用法的示例,但是读取它意味着它是decimal

  

decimal常量由一串数字表示,这些数字未用引号括起来并包含小数点。

因此,将bigint值乘以decimal会产生decimal值,如果您希望在除以1024时保留小数位数,则可能需要此值(和然后再次1024,虽然奇怪的是这些数字实际上是int文字,所以操作只是截断分割。

我没有测试过,但你可以试试这个:

SELECT
    SUM( FILEPROPERTY( name, 'SpaceUsed' ) ) * ( 8192.0 / 10485760 ) AS TotalGigabytes
FROM
    ...

如果您正在阅读代码并且需要进行研究以了解它正在做什么 - 通过添加解释性注释来帮助下一个阅读代码的人,以免他们不必进行研究,例如: “获取所有数据库使用的8KiB页面的总数,然后将其转换为千兆字节”。