您的位置:首页 > 数据库

数据统计存储过程规范(sql server)

2014-11-24 18:56 211 查看
在一个需要做大量数据统计分析的项目里,免不了需要写存储过程。如果过程不多不会有问题,但多了以后,维护和监控会产生很多问题。这时候,最好是对存储过程进行统一规范,对异常进行处理和对运行情况做日志记录。也使不同的人编写的过程格式一致,方便维护。

下面的SQL修改第一行,把"db_xxxx"换成自己的数据库名即可运行。【编写环境:sql server2008】

USE [db_xxxx]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*------------------------------------------------------------
--功能: 游戏数据统计(按天)
--返回:0-成功; 1-失败
◆测试
exec p_stat_xxxx;
exec p_stat_xxxx '2014-11-18';

◆修改记录: 日期 描述 作者
1. 2014.11.06 xxname 创建
------------------------------------------------------------*/
create PROCEDURE p_stat_xxxx
@dt datetime = null
WITH EXEC AS CALLER
AS
BEGIN
DECLARE @step INT;
DECLARE @datadate VARCHAR(10); --数据日期
DECLARE @dbname VARCHAR(20); --当前数据库名
DECLARE @procname VARCHAR(100); --本过程名称
DECLARE @optproc VARCHAR(100); --过程调用的过程
DECLARE @tablename VARCHAR(100); --过程当前处理的表名
DECLARE @err_msg VARCHAR(500); --出错时的错误描述
DECLARE @remark VARCHAR(500); --备注
DECLARE @start_tm DATETIME; --开始时间

SET @dbname    = DB_NAME();
SET @procname  = 'p_stat_xxxx';
SELECT @step      = 0,
@optproc   = '',
@tablename = '',
@remark    = '游戏数据统计',
@err_msg   = '',
@start_tm  = getdate();

IF @dt IS NULL
BEGIN
SET @dt = CONVERT(varchar(10), getdate() - 1, 120); --得到昨天的日期:2014-04-04
END
SET @datadate  = CONVERT(VARCHAR(10), @dt, 120); --数据日期:2014-04-04
--===========================================================================

BEGIN TRY
--记录日志
INSERT INTO t_run_log(dbname, datadate, step, procname, optproc, tablename, result, err_msg, tm, remark)
VALUES (@dbname, @datadate, @step, @procname, @optproc, @tablename, 'begin', @err_msg, getdate(), @remark);
---------------------------------此处写业务SQL end------------------------------
--游戏日报统计
SET @step = 1
--
--
--xxxx数据统计
SET @step = 2
--
--
--------------------------------此处写业务SQL start------------------------------
SET @remark  = @remark + '成功,耗时' + CONVERT(VARCHAR, DATEDIFF(SECOND, @start_tm, getdate()) / 60.00) +
'(分钟)' + @remark
--记录日志
INSERT INTO t_run_log(dbname, datadate, step, procname, optproc, tablename, result, err_msg, tm, remark)
VALUES      (@dbname, @datadate, @step, @procname, @optproc, @tablename, 'success', @err_msg, getdate(), @remark)
RETURN 0;
END TRY

BEGIN CATCH
--错误处理
DECLARE @ErrMsg VARCHAR(4500)
SET @ErrMsg      = 'Procedure:' + ISNULL(ERROR_PROCEDURE(), '-') + ' ErrorLine:' + CONVERT(VARCHAR(10), ERROR_LINE()) +
' ErrorNumber:' + CONVERT(VARCHAR(10), ERROR_NUMBER()) + ' Message:' + ERROR_MESSAGE();
SET @err_msg     = @ErrMsg;
SET @remark      = 'step: '+cast(@step as varchar(10))+'  失败,耗时' + CONVERT(VARCHAR, abs(datediff(mi, @start_tm, getdate()))) + '(分钟)' + @remark
print @remark;
--记录日志
INSERT INTO t_run_log(dbname, datadate, step, procname, optproc, tablename, result, err_msg, tm, remark)
VALUES      (@dbname, @datadate, @step, @procname, @optproc, @tablename, 'fail', @err_msg, getdate(), @remark)
RETURN 1;
END CATCH
END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: