您的位置:首页 > 数据库

1、SQL可搜索可排序可分页存储过程, 2、范围内的随机时间 适用于sql 2008以上

2015-10-29 18:27 627 查看
-- =============================================
-- Author:        蜘蛛王
-- Create date: 2015-10-29
-- Description:    可搜索 可排序 可分页存储过程 适用于sql2008以上
--       (非常重要,请认真使用)
-- =============================================

create PROCEDURE dbo.list
(
@table varchar(1000),--表名或视图表        (必须)
@orderby varchar(1000),--排序字段          (必须)
@fields varchar(max)='*',--欲选择字段列表  (可选)
@pageindex int=1,--页号,从1开始               (可选)
@pagesize int=20,--页尺寸                   (可选)
@where nvarchar(max) = N'',--条件           (可选)
@IsCount bit = 1 -- 返回记录总数, 非 0 值则返回 (可选)
)
AS
BEGIN
SET NOCOUNT ON
declare @sqlstr nvarchar(max)
set @sqlstr=''
set @orderby = ' order by ' + @orderby
if @where<>N''
set @where = ' Where ' + @where

--对第一页可以直接用top
if @pageindex=1
begin
set @sqlstr = 'select top ' + CONVERT(varchar(10),@pagesize) + ' ' + @fields + ' from ' + @table + @where + @orderby
end
else
begin
set @sqlstr = 'with temptbl as ('
+ ' SELECT ROW_NUMBER() OVER ('+ @orderby +') AS Row, '
+ @fields + ' from ' + @table + @where
+ ') SELECT '+ @fields + ' FROM temptbl where Row between ' + CONVERT(varchar(10),(@pageindex-1)*@pagesize+1) + ' and ' + CONVERT(varchar(10),(@pageindex-1)*@pagesize+@pagesize)

end
if @IsCount!=0
set @sqlstr = @sqlstr + ';select count(1) from ' + @table + @where
execute(@sqlstr)
END


--测试代码
exec list @table='dl_QQ',@orderby='iid desc',@IsCount=1, @pageindex =2, @fields='iid,qq', @where=' iid <30 '
exec list @table='dl_QQ',@orderby='iid desc',@IsCount=1, @pageindex =1, @fields='iid,qq', @where=' iid <30 '


/******************************
*    函数名:RandDateTime
*      作用:返回两个时间范围内的一个随机时间
*    Author:
*      Date: 2015-11-13
*      调用:select dbo.RandDateTime(NEWID(),'2015-11-03 11:24:17','2015-11-03 11:25:17')
*******************************/
go
--创建函数
alter Function RandDateTime
(
@newID uniqueidentifier, -- 用 NEWID()
@date_from DateTime,    --开始时间
@date_to DateTime       --结束时间
)
Returns DateTime
As
Begin

Return CAST(CAST(@date_from AS DECIMAL(18,8)) + -----开始时间 加上一个以天为整的数值作为新的日期
(
ABS(
CAST(
CAST( @newID AS Binary(17) )--把生成的一个二进制随机数转化为整数 并取其绝对值
AS INT
)
) / 10000.0
% ----防止随机数过大 取其对开始结束时间差的模
CAST(
(@date_to - @date_from) -----获取时间差 并转换成整型
AS DECIMAL(18,8)
)
) AS DATETIME)
End
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: