通用存储过程

来源:互联网 发布:fastboot模式备份数据 编辑:程序博客网 时间:2024/05/14 22:27

分页

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[Proc_Util_Page]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE dbo.Proc_Util_Page
GO

/*
分页
调用方法:EXEC Proc_Util_Page 'country,city', 'table', ' where 1=1', ' order by mid asc', 'mid', 1, 1, 0, ''
输入:
 1.字段(不可为空)
 2.表名(不可为空)
 3.条件(可以为空,需要where)
 4.排序(可以为空,需要order by,需要asc和desc字符)
 5.主键(可以为空)
 6.当前页数
 7.每页记录数
 8.输出总记录条数(若<1则执行count)
 9.输出sql语句
返回:记录集
*/
CREATE PROCEDURE dbo.Proc_Util_Page
(
 @sField nvarchar(1000),
 @sTable nvarchar(1000),
 @sWhere nvarchar(1000),
 @sOrderby nvarchar(1000),
 @sPkey nvarchar(50),
 @iPageIndex int,
 @iPageSize int,
 @iRecordCount int OUTPUT,
 @sOutsql nvarchar(4000) OUTPUT
)
--WITH ENCRYPTION
AS
BEGIN
 SET NOCOUNT ON

 DECLARE @iRC int, @sSQL nvarchar(4000), @sW nvarchar(1000), @sOB nvarchar(1000), @sT nvarchar(100)
 SELECT @iRC = @iRecordCount, @sSQL = '', @sW = ' WHERE 1=1 ', @sOB = ''

 --判断条件
 IF RTRIM(@sWhere) != '' AND @sWhere IS NOT NULL
  BEGIN
   SET @sW=' ' + @sWhere + ' '
  END

 --判断总记录数
 IF @iRC<1
  BEGIN
   SET @sSQL='SELECT @iRC=Count(*) FROM ' + @sTable + @sW
   EXEC sp_executesql @sSQL,N'@iRC int OUT',@iRC OUT
  END

 --判断页数是否超出范围
 SELECT @iPageIndex=(CASE WHEN @iRC<(@iPageIndex-1)*@iPageSize THEN CEILING(@iRC/@iPageSize) WHEN @iPageIndex<1 THEN 1 ELSE @iPageIndex END)

 --判断排序
 IF RTRIM(@sOrderby) != '' AND @sOrderby IS NOT NULL
  BEGIN
   SELECT @sOB=' ' + @sOrderby + ' '
  END

 --如果是第一页
 IF @iPageIndex=1
  BEGIN
   SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+'
'+@sField+' FROM '+@sTable+@sW+@sOB
   GOTO step4
  END

 --看有否主键
 IF RTRIM(@sPkey) = '' OR @sPkey IS NULL
  GOTO step1
 ELSE
  --看是否按主键排序
  BEGIN
   DECLARE @sOB1 nvarchar(1000), @sPkey1 nvarchar(50)
   SELECT @sOB1 = UPPER(@sOrderby), @sPkey1 = UPPER(@sPkey)
   IF CHARINDEX(@sPkey1 + ' ASC', @sOB1)>0
    BEGIN
     SET @sT='>(SELECT MAX('
     GOTO step2
    END
   IF CHARINDEX(@sPkey1 + ' DESC', @sOB1)>0
    BEGIN
     SET @sT='<(SELECT MIN('
     GOTO step2
    END
   GOTO step3
  END

 --如果无主键
 step1:
  BEGIN
   SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+'
'+@sField+' FROM '+@sTable+@sW + ' AND EXISTS (SELECT TOP '+CAST((@iPageIndex-1)*@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sW+@sOB+')'+@sOB+')'
   GOTO step4
  END
 --纯按主键排序
 step2:
  BEGIN
   SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+'
'+@sField+' FROM '+@sTable+@sW+' AND '+@sPkey+@sT+@sPkey+') FROM (SELECT TOP '+CAST((@iPageIndex-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sW+@sOB+') AS tbTemp)'+@sOB
   GOTO step4
  END
 --不纯按主键排序
 step3:
  BEGIN
   SET @sSQL='SELECT
'+@sField+' FROM '+@sTable+@sW + ' AND ' + @sPkey+' IN (SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sW + ' AND ' + @sPkey+' NOT IN(SELECT TOP '+CAST((@iPageIndex-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sW+@sOB+')'+@sOB+')'+@sOB
   GOTO step4
  END
 --输出最终执行的分页sql语句并执行
 step4:
  SELECT @sOutsql = @sSQL, @iRecordCount = @iRC
  --print(@sSQL)
  EXEC(@sSQL)

 SET NOCOUNT OFF
END
GO

*************************************************************************

取总数

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[Proc_Record_Count]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE dbo.Proc_Record_Count
GO

/*
调用方法:EXEC Proc_Record_Count '表名', '1=1', ''
输入:
 1.表名
 2.条件(不包含WHERE)
 3.输出
*/
CREATE PROCEDURE dbo.Proc_Record_Count
(
 @insTable varchar(50),
 @insCondition varchar(1000),
 @count int output
)
--WITH ENCRYPTION
AS
BEGIN
 SET NOCOUNT ON
 IF(@insCondition <> '')
  SET @insCondition = ' WHERE ' + @insCondition
 DECLARE @SqlStr As nvarchar(2000)
 SET @SqlStr = 'SELECT @count=COUNT(*) FROM ' + @insTable + @insCondition
 EXEC sp_executesql @SqlStr,
N'@count int output', @count output
 SET NOCOUNT OFF
END
GO

*********************************************************************

添加

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[Proc_Record_Add]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE dbo.Proc_Record_Add
GO

/*
调用方法:EXEC Proc_Record_Add '表名', 'id,name', '3,2', ''
输入:
 1.表名
 2.表字段
 3.添加字段
 4.输出
*/
CREATE PROCEDURE dbo.Proc_Record_Add
(
 @insTable varchar(50),
 @insField varchar(1000),
 @insStr varchar(2000),
 @returnflag int output
)
--WITH ENCRYPTION
AS
BEGIN
 SET NOCOUNT ON
 BEGIN TRAN
 DECLARE @SQL As nvarchar(4000)
 SET @SQL = 'INSERT INTO ' + @insTable + ' (' + @insField + ') VALUES(' + @insStr + ');SELECT @returnflag = SCOPE_IDENTITY()'
 EXEC sp_executesql @SQL,
N'@returnflag int output', @returnflag output
 IF @@ERROR <> 0
  ROLLBACK TRAN
 ELSE
  COMMIT TRAN
 SET NOCOUNT OFF
END
GO

********************************************************************************

取记录集

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[Proc_Record_View]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE dbo.Proc_Record_View
GO

/*
调用方法:EXEC Proc_Record_View 'id,name', '表名', '1=1'
输入:
 1.表字段
 2.表名
 3.条件(不包含WHERE)
*/
CREATE PROCEDURE dbo.Proc_Record_View
(
 @insField varchar(1000),
 @insTable varchar(50),
 @insCondition varchar(1000)
)
--WITH ENCRYPTION
AS
BEGIN
 SET NOCOUNT ON
 IF(@insCondition <> '')
  SET @insCondition = ' WHERE ' + @insCondition
 DECLARE @SQL As varchar(4000)
 SET @SQL = 'SELECT ' + @insField + ' FROM ' + @insTable + @insCondition
 EXEC(@SQL)
 SET NOCOUNT OFF
END
GO

********************************************************************

删除

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[Proc_Record_Del]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE dbo.Proc_Record_Del
GO

/*
调用方法:EXEC Proc_Record_Del '表名', '1=1'
输入:
 1.表名
 2.条件(不包含WHERE)
*/
CREATE PROCEDURE dbo.Proc_Record_Del
(
 @insTable varchar(50),
 @insCondition varchar(1000)
)
--WITH ENCRYPTION
AS
BEGIN
 SET NOCOUNT ON
 BEGIN TRAN
 IF(@insCondition <> '')
  SET @insCondition = ' WHERE ' + @insCondition
 DECLARE @SQL As varchar(2000)
 SET @SQL = 'DELETE FROM ' + @insTable + @insCondition
 EXEC(@SQL)
 IF @@ERROR <> 0
  ROLLBACK TRAN
 ELSE
  COMMIT TRAN
 SET NOCOUNT OFF
END
GO

*******************************************************************************

修改

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[Proc_Record_Edit]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE dbo.Proc_Record_Edit
GO

/*
调用方法:EXEC Proc_Record_Edit '表名', 'id=2,name=2', '1=1'
输入:
 1.表名
 2.修改字段
 3.条件(不包含WHERE)
*/
CREATE PROCEDURE dbo.Proc_Record_Edit
(
 @insTable varchar(100),
 @insStr varchar(2000),
 @insCondition varchar(1000)
)
--WITH ENCRYPTION
AS
BEGIN
 SET NOCOUNT ON
 BEGIN TRAN
 IF(@insCondition <> '')
  SET @insCondition = ' WHERE ' + @insCondition
 DECLARE @SQL As varchar(4000)
 SET @SQL = 'UPDATE ' + @insTable + ' SET ' + @insStr + @insCondition
 EXEC(@SQL)
 IF @@ERROR <> 0
  ROLLBACK TRAN
 ELSE
  COMMIT TRAN
 SET NOCOUNT OFF
END
GO

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕妇感冒了流黄鼻涕怎么办 怀孕感冒了怎么办鼻塞流鼻涕 怀孕初期感冒了怎么办鼻塞流鼻涕 怀孕9个月流鼻涕怎么办 怀孕5个月流鼻涕怎么办 小孩老是流黄鼻涕口臭怎么办 狗狗有食欲流黄鼻涕拉稀怎么办 小孩流黄鼻涕咳嗽怎么办 小狗感冒了一直打喷嚏怎么办 眼干眼屎多模糊怎么办 宝宝眼睛上火眼屎多怎么办 眼睛发干眼屎多怎么办 三个月宝宝眼睛流泪有眼屎怎么办 小孩眼睛流泪有眼屎怎么办 宝宝上火眼睛有好多眼屎怎么办 宝宝眼睛流泪还有眼屎怎么办? 新生儿眼睛上火眼屎多怎么办 铁耳屎在最里面怎么办 婴儿鼻屎特别深怎么办 鼻子干呼吸就疼怎么办 儿童鼻子里总有好多鼻屎怎么办 小孩鼻子里有鼻屎呼吸不通怎么办 鼻子不通通气鼻屎粘在鼻子怎么办 鼻子里面干燥长鼻屎怎么办 鼻孔里干的难受怎么办 每天有很多鼻屎怎么办 鼻子里面干的疼怎么办 婴儿鼻屎堵住了怎么办 婴儿有很多鼻屎怎么办 隆鼻7天好多鼻屎怎么办 隆鼻第五天好多鼻屎怎么办 小孩鼻屎堵住了怎么办 风寒感冒流清鼻涕怎么办 流清鼻涕吐黄痰不发烧怎么办 宝宝流黄鼻涕发烧怎么办 感冒了浓鼻涕多怎么办 感冒流浓鼻涕怎么办速效办法 孩子一直流清水鼻涕怎么办 宝宝鼻子呼噜呼噜响怎么办 鼻涕往嗓子里流怎么办 咳嗽痰多鼻涕多怎么办