NULL在SQLServer数据库日志文件中的存储

日志文件ldf中的null

参考日志文件结构
http://blog.csdn.net/jinjazz/archive/2008/08/07/2783872.aspx

通过null_bitmap来确定哪些字段为null,所以在日志中null是不占空间的。

下面可以在得到一行二进制内容,比如通过fn_dbLog函数或者dbcc checklog,然后检查此行内容那些是列是null

static byte[] ReadRowData() { //代码略去 return null; } static void AnerlizeNull() { byte[] data = ReadRowData();//表示一行数据的二进制 //从第二个字节算起,data[2] short index = 2; //第二字节内容为pos_columns_count,表示第pos_columns_count个字节存放了列数信息,可以把本字节理解为指针 short pos_columns_count = BitConverter.ToInt16(data, index); //pos_columns_count内容为data_columns_count,表示这个表有data_columns_count列 short data_columns_count = BitConverter.ToInt16(data, pos_columns_count); //pos_columns_count的后两个字节开始表示了Null列信息,Null列信息不止占用1个字节,因为每列按位保存,如果列多,他的占用字节也多 short pos_null_map = (short)(pos_columns_count + 2); //算Null信息占用多少字节 int data_null_map_length = (int)System.Math.Ceiling((double)data_columns_count / 8); //读取Null列的标志内容 byte[] data_null_map = new byte[data_null_map_length]; System.Array.Copy(data, pos_null_map, data_null_map, 0, data_null_map_length); //这里就可以开始检查一个表格的任何一列是否null了,null的数据是不在数据区的,只记录在Null列的标志内容中。 //比如看第10列是否null checkNull(data_null_map, 10); } static bool checkNull(byte[] map, short col_order) { int mapIndex = (col_order - 1) / 8; int mapExp = (col_order - 1) % 8; int iResult = (int)System.Math.Pow(2, mapExp); return (iResult & map[mapIndex]) != 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值