xchapter

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
View Code
  1 CREATE PROCEDURE proc_Pagerlister
2 @TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名
3 @PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空
4 @Fields VARCHAR(200), --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
5 @PageSize INT, --每页记录数
6 @CurrentPage INT, --当前页,0表示第1页
7 @Filter VARCHAR(200) = '', --条件,可以为空,不用填 where
8 @Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by
9 @Order VARCHAR(200) = '' --排序,可以为空,为空默认按主键升序排列,不用填 order by
10 WITH ENCRYPTION
11 AS
12 SET NoCount ON
13
14 DECLARE @SortColumn VARCHAR(200)
15 DECLARE @Operator CHAR(2)
16 DECLARE @SortTable VARCHAR(200)
17 DECLARE @SortName VARCHAR(200)
18 BEGIN
19 IF @Fields = ''
20 SET @Fields = '*'
21 IF @Filter = ''
22 SET @Filter = 'WHERE 1=1'
23 ELSE
24 SET @Filter = 'WHERE ' + @Filter
25 IF @Group <> ''
26 SET @Group = 'GROUP BY ' + @Group
27 IF @Order <> ''
28 BEGIN
29 DECLARE @pos1 INT,
30 @pos2 INT
31 SET @Order = REPLACE(REPLACE(@Order,' asc',' ASC'),' desc',' DESC')
32
33 IF Charindex(' DESC',@Order) > 0
34 IF Charindex(' ASC',@Order) > 0
35 BEGIN
36 IF Charindex(' DESC',@Order) < Charindex(' ASC',@Order)
37 SET @Operator = '<='
38 ELSE
39 SET @Operator = '>='
40 END
41 ELSE
42 SET @Operator = '<='
43 ELSE
44 SET @Operator = '>='
45
46 SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order,' ASC',''),' DESC',''),
47 ' ','')
48
49 SET @pos1 = Charindex(',',@SortColumn)
50
51 IF @pos1 > 0
52 SET @SortColumn = Substring(@SortColumn,1,@pos1 - 1)
53
54 SET @pos2 = Charindex('.',@SortColumn)
55
56 IF @pos2 > 0
57 BEGIN
58 SET @SortTable = Substring(@SortColumn,1,@pos2 - 1)
59
60 IF @pos1 > 0
61 SET @SortName = Substring(@SortColumn,@pos2 + 1,@pos1 - @pos2 - 1)
62 ELSE
63 SET @SortName = Substring(@SortColumn,@pos2 + 1,Len(@SortColumn) - @pos2)
64 END
65 ELSE
66 BEGIN
67 SET @SortTable = @TableNames
68
69 SET @SortName = @SortColumn
70 END
71 END
72 ELSE
73 BEGIN
74 SET @SortColumn = @PrimaryKey
75
76 SET @SortTable = @TableNames
77
78 SET @SortName = @SortColumn
79
80 SET @Order = @SortColumn
81
82 SET @Operator = '>='
83 END
84
85 DECLARE @type VARCHAR(50)
86
87 DECLARE @prec INT
88
89 SELECT @type = t.Name,
90 @prec = c.prec
91 FROM sySobjects o
92 JOIN sysColumns c
93 ON o.Id = c.Id
94 JOIN syStypes t
95 ON c.xUserType = t.xUserType
96 WHERE o.Name = @SortTable
97 AND c.Name = @SortName
98
99 IF Charindex('char',@type) > 0
100 SET @type = @type + '(' + CAST(@prec AS VARCHAR) + ')'
101
102 DECLARE @TopRows INT
103
104 SET @TopRows = @PageSize * @CurrentPage + 1
105
106 PRINT @TopRows
107
108 PRINT @Operator
109
110 EXEC( '
111 DECLARE @SortColumnBegin ' + @type + '
112 SET ROWCOUNT ' + @TopRows + '
113 SELECT @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + '
114 SET ROWCOUNT ' + @PageSize + '
115 SELECT ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '
116 ')
117 END

posted on 2011-10-12 00:01  xchapter  阅读(183)  评论(0)    收藏  举报