一个函数解决SQLServer中bigint 转 int带符号时报错问题

所属分类: 数据库 / MsSql 阅读数: 1633
收藏 0 赞 0 分享

有一个需求是要在一个云监控的状态值中存储多个状态(包括可同时存在的各种异常、警告状态)使用了位运算机制在一个int型中存储。

现在监控日志数据量非常大(亿级别)需要对数据按每小时、每天进行聚合,供在线报表使用。
状态分了3个级别:正常(0)、警告(1)、异常(2),聚合时需要使用max选择最差的状态,就需要对状态值进行处理加上级别和状态位个数,就要借助bigint型来做运算了,

问题是再将bigint 转为 int时获取原始状态值时,SQLServer报错了:

消息 8115,级别 16,状态 2,第 1 行
将 expression 转换为数据类型 int 时出现算术溢出错误。

因为状态码中已经用到了 0x80000000, 出现了符号位的问题。
写了一个转换函数解决了。

CREATE FUNCTION [dbo].[BigintToInt]
(
   @Value bigint  
)
RETURNS int
AS
BEGIN
   -- 是否有int符号位
   IF @Value & 0x80000000 <> 0 RETURN @Value & 0xFFFFFFFF | 0xFFFFFFFF00000000
   -- 无符号位
   RETURN @Value & 0xFFFFFFFF
END

更多精彩内容其他人还在看

一个函数解决SQLServer中bigint 转 int带符号时报错问题

这篇文章主要介绍了解决SQLServer中bigint 转 int带符号时报错问题的函数,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLServer恢复表级数据详解

这篇文章主要介绍了SQLServer中用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLSERVER 清除历史记录的方法

使用SQL Server登录使用数据库时,登录过的记录会出现在登录框中,下面是删除方法,需要的朋友可以参考下
收藏 0 赞 0 分享

浅析SQL server 临时表

这篇文章主要介绍了SQL server 临时表的创建查询以及使用过程中应注意的事项,需要的朋友可以参考下
收藏 0 赞 0 分享

MSSQL段落还原脚本,SQLSERVER段落脚本

“段落还原”(在 SQL Server 2005 中引入)允许分阶段还原和恢复包含多个文件组的数据库。段落还原包括从主文件组开始(有时也从一个或多个辅助文件组开始)的一系列还原序列。
收藏 0 赞 0 分享

SQL SERVER中关于exists 和 in的简单分析

这篇文章主要介绍了SQL SERVER中关于exists 和 in的简单分析,需要的朋友可以参考下
收藏 0 赞 0 分享

Transactional replication(事务复制)详解之如何跳过一个事务

事务复制由 SQL Server 快照代理、日志读取器代理和分发代理实现。 快照代理准备快照文件(其中包含了已发布表和数据库对象的架构和数据),然后将这些文件存储在快照文件夹中,并在分发服务器中的分发数据库中记录同步作业。
收藏 0 赞 0 分享

SQL语句中含有乘号报错的处理办法

这篇文章主要介绍了SQL语句中含有乘号报错的处理办法,需要的朋友可以参考下
收藏 0 赞 0 分享

SQL SERVER先判断视图是否存在然后再创建视图的语句

SQL SERVER中先判断视图是否存在,使用IF NOT EXISTS,然后再创建视图,使用create view,整个过程如下
收藏 0 赞 0 分享

sql中循环处理当前行数据和上一行数据相加减

曾经,sql中循环处理当前行数据和上一行数据浪费了我不少时间,学会后才发现如此容易,其实学问就是如此,难者不会,会者不难。
收藏 0 赞 0 分享
查看更多