一个SQL自连接的应用

今天,某童鞋给我说他遇到一个统计的难题,他们发行了一些优惠券,他们想统计所有使用优惠券人员的总共消费金额。而且是仅统计使用优惠券的人员的所有付款方式的消费金额总计。

表结构如下:

bjg

想要实现我做了个自连接,

select a.c_id,sum(b.c_amount) from tb_o_sm a,tb_o_sm b where a.c_type=’2′ and a.c_id=b.c_id group by a.c_id;

结果如下:

bjg2

SQL Server 数据恢复

今天下午接到大张老师电话,问能不能恢复SQL Server中已经被删除的一条记录,忽然想起若干年前牙牙老师也问过我这个问题,于是放狗搜索了下,找到了解决方案。

因为SQL Server是基于日志管理的数据库系统,每一笔操作都有详细的日志作为记录,这为我们做恢复提供了非常有利的先决条件,通过搜索引擎,我查找到了一款名为“LogExplorer”的商业软件,可以对SQL Server的日志进行分析,并通过日志恢复数据。

这是一款商业软件,未注册版本可以使用30天,安装的时候需要同时安装客户端及服务器端。软件运行界面如下图。

LogExplorer

而我们要做的非常简单,点击左侧的“View Log”即可查询所有的日志信息,如下图:

LogExplorer-1

因为我们的日志数量非常多,而日志中又记录了全部的CRUD操作,我们只想筛选某一时间的某种操作,怎么办呢,很简单,点选上图工具栏的第一个图标即可。点击之后,他会让你选择筛选条件,如下图:

LogExplorer-2

除了可以设置筛选的时间之外,我们还可以按照操作进行筛选~如下图:

LogExplorer-3

在这里我仅仅针对删除的记录做筛选,从上图中看出,我们几乎可以对所有的操作进行筛选~筛选完成点击“Apply”。系统便会给出我们筛选结果~

LogExplorer-4

经过我们的筛选,列表中只剩下一条记录啦,经查,这条记录就是被我们误删的记录。那我们想要恢复这条记录,也只是仅仅需要在记录上面点右键,选择“Undo Transaction”如下图。

LogExplorer-5

他的恢复并不是直接作用于数据库,而是生成对应操作的逆操作脚本,所以在选择“Undo Transaction”之后,系统会让你给出脚本的保存位置。系统导出的脚本如下:

LogExplorer-6

最后再通过SQL Server自带的查询分析器执行生成的脚本,即可恢复记录。

点此下载:LogExpress

更多关于Log Explorer的使用,可以参考:

LogExplore的一个详细操作手册

SQL Server 2005 收缩数据库

1. 在 SQL Server Management Studio 对象资源管理器中,连接到 Microsoft SQL Server 数据库引擎,然后展开该实例。
2. 鼠标单击工具栏“新建查询”,或服务器名上右键单击“新建查询”。
3. 在窗口SQLQuery1.sql中输入“DUMP TRANSACTION 数据库名 WITH NO_LOG”,再点击“执行”按钮。例如:“DUMP TRANSACTION LbUCP WITH NO_LOG”。
4. 数据库名右键点击“任务”、“收缩”、“文件”。在“文件类型”中选择“日志”文件。默认选项为“数据”。在“收缩操作”、“在释放未使用的空间前重新组织页”、“将文件收缩到”xx M,这里会给出一个允许收缩到最小为M数,直接输入这个数,“确定”就可以了。

SqlServer 2000 & SqlServer 2005 分页存储过程(转)

哈 刚才在CSDN找到了一组分页的存储过程,正好最近也在学习这个,故转载过来留作存档哈~

sql server 2005的分页存储过程分3个版本,一个是没有优化过的,一个是优化过的,最后一个支持join的,sql server 2000的分页存储过程,也可以运行在sql server 2005上,但是性能没有sql server 2005的版本好。

在最后 我还附带了一个二分法的分页存储过程,也很好用的说哈~~

1.SqlServer 2005:

[codesyntax lang=”sql”]

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE proc [dbo].[up_Page2005]
 @TableName varchar(50),        --表名
 @Fields varchar(5000) = '*',    --字段名(全部字段为*)
 @OrderField varchar(5000),        --排序字段(必须!支持多字段)
 @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
 @pageSize int,                    --每页多少条记录
 @pageIndex int = 1 ,            --指定当前为第几页
 @TotalPage int output            --返回总页数
as
begin

    Begin Tran --开始事务

    Declare @sql nvarchar(4000);
    Declare @totalRecord int;

    --计算总记录数

    if (@SqlWhere='' or @sqlWhere=NULL)
        set @sql = 'select @totalRecord = count(*) from ' + @TableName
    else
        set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere

    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数

    --计算总页数
    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)

    if (@SqlWhere='' or @sqlWhere=NULL)
        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName
    else
        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere

    --处理页数超出范围情况
    if @PageIndex<=0
        Set @pageIndex = 1

    if @pageIndex>@TotalPage
        Set @pageIndex = @TotalPage

     --处理开始点和结束点
    Declare @StartRecord int
    Declare @EndRecord int

    set @StartRecord = (@pageIndex-1)*@PageSize + 1
    set @EndRecord = @StartRecord + @pageSize - 1

    --继续合成sql语句
    set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
     print @sql
    Exec(@Sql)
    ---------------------------------------------------
    If @@Error <> 0
      Begin
        RollBack Tran
        Return -1
      End
     Else
      Begin
        Commit Tran
        Return @totalRecord ---返回记录总数
      End
end

[/codesyntax]

继续阅读“SqlServer 2000 & SqlServer 2005 分页存储过程(转)”