SQL Server 数据库(数据表)损坏修复 dbcc checkdb、dbcc checktable

一般数据库损坏可以尝试使用dbcc checkdb(‘dbname’)直接处理即可,但有时直接使用此方法不会显示任何的错误信息,且不会有任何的修复动作。
然后尝试使用checktable命令则有反应且可以恢复,但数据表多的时候不可能自己手动一个个复制表名执行吧,这时候遍历所有数据表依次修复数据表是不错的解决方案。
首先需要将数据库设置为单用户连接,恢复完毕后取消单用户设置即可。

设置单用户模式:
declare @dbname varchar(255)      
set @dbname='UFDATA_002_2016'      
exec sp_dboption @dbname,'single user','true'    

取消单用户模式:
exec sp_dboption @dbname,'single user','false'    

修复的sql代码如下:
该代码效果是使遍历当前数据库的表,将所有表依次执行checktable操作。

use ufdata_001_2016
go
declare @i int, @val nvarchar(100)
set @i = 4700
while @i <= 5397
begin
	select @val = name from 
	(select ROW_NUMBER() over(order by name) rowid, name from sys.tables) a
	where rowid = @i
	
	if object_id(@val,N'U') is not null	
	begin
	dbcc checktable(@val,REPAIR_ALLOW_DATA_LOSS)      
	dbcc checktable(@val,REPAIR_REBUILD)  
	end
	 set @i = @i + 1
end

另损坏的数据表直接select查询时,有可能会报这个错误:
消息 605,级别 21,状态 3,第 2 行
尝试在数据库 9 中提取逻辑页 (1:18488) 失败。该逻辑页属于分配单元 281474979397632,而非 281474980642816。
以下为查询对应表名的语句,将查询出来的表名手动进行checktable修复以解决问题。

SELECT au.allocation_unit_id, OBJECT_NAME(p.object_id) AS table_name, fg.name AS filegroup_name,
au.type_desc AS allocation_type, au.data_pages, partition_number
FROM sys.allocation_units AS au
JOIN sys.partitions AS p ON au.container_id = p.partition_id
JOIN sys.filegroups AS fg ON fg.data_space_id = au.data_space_id
WHERE au.allocation_unit_id = 281474979397632 OR au.allocation_unit_id = 281474980642816
ORDER BY au.allocation_unit_id;

通过SQLCMD执行SQLServer的定时备份

  1.  首先创建SQL文件
    declare @device varchar(30);
    declare @filename varchar(50);
    declare @datetime varchar(50);
    
    set @datetime =  convert(varchar(20),getdate(),112);
    set @device= @datetime;
    set @device= 'NWdevice' + @datetime;
    set @filename='D:\备份\'+@datetime+'.bak'
    
    execute sp_addumpdevice 'disk',@device,@filename;
    backup database developrdb to @device
    
    
  2. 创建bat批处理文件
    @sqlcmd -i backup.sql -d developrdb -s 127.0.0.1
  3. 在Windows控制面板下的任务计划定时调用bat文件即可。(此步骤详细操作略)

Excel 将含有上下午日期格式转换为24小时一般日期格式

带有上下午的日期格式有时直接通过改变单元格格式是不会发生变化的,所以这里提供一个转换函数,转换后可以通过设置单元格格式转换为自己想要的效果:

=REPLACE(D2,FIND(“午”,D2&”上午”)-1,3,)+COUNTIF(D2,”*下*”)/2*ISERR(FIND(“下午 12”,D2))

 

 

参考链接:http://club.excelhome.net/thread-859395-1-1.html

Javascript 相对文档获取鼠标定位代码

 

function getMousePos(event) {
            var e = event || window.event;
            var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
            var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
            var x = e.pageX || e.clientX + scrollX;
            var y = e.pageY || e.clientY + scrollY;
            //alert('x: ' + x + '\ny: ' + y);
            return { 'x': x, 'y': y };
}

参考链接:http://www.cnblogs.com/dolphinX/archive/2012/10/09/2717119.html