1.存储过程中的 输出参数 create proc sp_pager @totalcount int output,@totalpagecount int output 2.对变量的赋值(set\select) select适合对多变量赋值,而set适合给单变量赋值 select可以将多个值赋给自己,取最后一个,而set只能给单个值赋值 select对赋值为空的值保持原来的值,而set对赋值为空的值结果为NULL set\select赋值后原来的查询执行不返回只将结果给赋值的变量。 (1).select @name=name,@age=age from t_person (2).select name from (select @name=name from t_person) 3.控制语句 (1).if语句 if 条件 or 条件 begin sql语句 end else begin sql语句 end if条件可以嵌套 if @primarykey is null or @primarykey='' begin select @primarykey=c.name from sys.all_columns c join sys.all._objects o on c.object_id=o.object_id where o.name=@tablename and c.column_id=1 end (2).while语句 while 条件 or 条件 begin sql语句 end while charindex(',',@order)>0 or charindex(',',@order)>0 begin set @order=replace(@order,',' ,',') end 4.charindex函数:查找字符 charindex(@primarykey,@order) => @order中是否存在@primarykey,返回为int 5.set nocount on:不返回影响的行 set oncount off:返回影响的行 6.isnull函数:空值赋值 isnull(@totalcount,''):如果@totalcount不为NULL则返回@totalcount否则返回'' 7.rtrim\ltrim函数:(右边,左边)去空格 8.replace函数:替换 replace(rtrim(ltrim(@fieldlist)),' ',''):将@fieldlist中前后中的空格都去掉 9.round()\floor()\ceiling()函数 round() 遵循四舍五入把原值转化为指定小数位数,如:round(1.45,0) = 1;round(1.55,0)=2 floor()向下舍入为指定小数位数 如:floor(1.45,0)= 1;floor(1.55,0) = 1 ceiling()向上舍入为指定小数位数 如:ceiling(1.45,0) = 2;ceiling(1.55,0)=210. 10.substring函数:获取子字符串 substring(@new_order2,1,len(@new_order2)-1):获取@new_order2中从1到最后位置的字符串 11.'<>'/'!=':不等于 12.str函数:返回一个数字的指定长度的字符串 str(@number,3,0):返回@number中整数部分为3,小数部分为0的字符串 也可使用str(@number)则将数字转换为字符串
1 USE [YLBX] 2 GO 3 4 /****** Object: StoredProcedure [dbo].[Sp_Pager] Script Date: 03/24/2013 23:10:40 ******/ 5 SET ANSI_NULLS ON 6 GO 7 8 SET QUOTED_IDENTIFIER ON 9 GO 10 11 12 -- ============================================= 13 -- Author: <Author,,Name> 14 -- Create date: <Create Date,,> 15 -- Description: <Description,,> 16 -- ============================================= 17 CREATE PROCEDURE [dbo].[Sp_Pager] 18 -- Add the parameters for the stored procedure here 19 @TableName VARCHAR(200), --表名 20 @FieldList VARCHAR(2000), --显示列名,如果是全部字段则为* 21 --@PrimaryKey VARCHAR(100), --单一主键或唯一值键 22 @Where VARCHAR(2000)='', --查询条件 不含'where'字符,如id>10 and len(userid)>9 23 @Order VARCHAR(1000)='', --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc 24 --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷 25 --@SortType INT=1, --排序规则 1:正序asc 2:倒序desc 3:多列排序方法 26 --@RecorderCount INT=0, --记录总数 0:会返回总记录 27 @PageSize INT=20, --每页输出的记录数 28 @PageIndex INT=1, --当前页数 29 @TotalCount INT OUTPUT , --记返回总记录 30 @TotalPageCount INT OUTPUT --返回总页数 31 AS 32 BEGIN 33 -- SET NOCOUNT ON added to prevent extra result sets from 34 -- interfering with SELECT statements. 35 --得到主键 36 declare @PrimaryKey varchar(2000) --单一主键或唯一值键 37 declare @SortType int 38 declare @RecorderCount int 39 Select @SortType=1 40 select @RecorderCount=0 41 select @PrimaryKey=COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=@TableName 42 if @PrimaryKey is null or @PrimaryKey='' 43 begin 44 select @PrimaryKey=c.name from sys.all_columns c join sys.all_objects o on c.object_id=o.object_id 45 where o.name=@TableName and c.column_id=1 46 end 47 -- 48 if @Order<>'' 49 begin 50 if CHARINDEX(@PrimaryKey,@Order)=0 51 begin 52 if CHARINDEX('asc',@Order)=0 and charindex('desc',@Order)=0 53 select @order=@order+' asc' 54 select @Order=@Order+','+@PrimaryKey+' asc' 55 select @sorttype=3 56 end 57 else 58 begin 59 if CharIndex(',',@Order)=0 60 begin 61 if CHARINDEX('desc',@order)>0 62 begin 63 select @sorttype=2 64 end 65 end 66 end 67 end 68 -- 69 SET NOCOUNT ON; 70 71 -- Insert statements for procedure here 72 IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0 73 SET @Order = RTRIM(LTRIM(@Order)) 74 SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey)) 75 SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','') 76 WHILE CHARINDEX(', ',@Order) > 0 or CHARINDEX(' ,',@Order) > 0 77 BEGIN 78 SET @Order = REPLACE(@Order,', ',',') 79 SET @Order = REPLACE(@Order,' ,',',') 80 END 81 IF ISNULL(@TableName,'') = '' or ISNULL(@FieldList,'') = '' 82 or ISNULL(@PrimaryKey,'') = '' 83 or @SortType < 1 or @SortType >3 84 or @RecorderCount < 0 or @PageSize < 0 or @PageIndex < 0 85 BEGIN 86 PRINT('ERR_00') 87 RETURN 88 END 89 IF @SortType = 3 90 BEGIN 91 IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC') 92 BEGIN PRINT('ERR_02') RETURN END 93 END 94 DECLARE @new_where1 VARCHAR(1000) 95 DECLARE @new_where2 VARCHAR(1000) 96 DECLARE @new_order1 VARCHAR(1000) 97 DECLARE @new_order2 VARCHAR(1000) 98 DECLARE @new_order3 VARCHAR(1000) 99 DECLARE @Sql VARCHAR(8000) 100 DECLARE @SqlCount NVARCHAR(4000) 101 IF ISNULL(@where,'') = '' 102 BEGIN 103 SET @new_where1 = ' ' 104 SET @new_where2 = ' Where ' 105 END 106 ELSE 107 BEGIN 108 SET @new_where1 = ' Where ' + @where 109 SET @new_where2 = ' Where ' + @where + ' AND ' 110 END 111 IF ISNULL(@order,'') = '' or @SortType = 1 or @SortType = 2 112 BEGIN 113 IF @SortType = 1 114 BEGIN 115 SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' ASC' 116 SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' DESC' 117 END 118 IF @SortType = 2 119 BEGIN 120 SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' DESC' 121 SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' ASC' 122 END 123 END 124 ELSE 125 BEGIN 126 SET @new_order1 = ' orDER BY ' + @Order 127 END 128 129 IF @SortType = 3 AND CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0 130 BEGIN 131 SET @new_order1 = ' orDER BY ' + @Order 132 SET @new_order2 = @Order + ',' 133 SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},') 134 SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,') 135 SET @new_order2 = ' orDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1) 136 IF @FieldList <> '*' 137 BEGIN 138 SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',') 139 SET @FieldList = ',' + @FieldList 140 WHILE CHARINDEX(',',@new_order3)>0 141 BEGIN 142 IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0 143 BEGIN 144 SET @FieldList = 145 @FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3)) 146 END 147 SET @new_order3 = 148 SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3)) 149 END 150 SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList)) 151 END 152 END 153 154 SET @SqlCount = 'Select @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/' 155 + CAST(@PageSize AS VARCHAR)+') FROM (Select * FROM ' + @TableName + @new_where1+') AS T' 156 IF @RecorderCount = 0 157 BEGIN 158 EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT', 159 @TotalCount OUTPUT,@TotalPageCount OUTPUT 160 END 161 ELSE 162 BEGIN 163 Select @TotalCount = @RecorderCount 164 END 165 IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize) 166 BEGIN 167 SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize) 168 END 169 IF @PageIndex = 1 or @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) 170 BEGIN 171 IF @PageIndex = 1 --返回第一页数据 172 BEGIN 173 SET @Sql = 'Select * FROM (Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 174 + @TableName + @new_where1 + @new_order1 +') AS TMP ' + @new_order1 175 END 176 IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) --返回最后一页数据 177 BEGIN 178 SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 179 + 'Select TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize)) 180 + ' ' + @FieldList + ' FROM ' 181 + @TableName + @new_where1 + @new_order2 + ' ) AS TMP ' 182 + @new_order1 183 END 184 END 185 ELSE 186 187 BEGIN 188 IF @SortType = 1 --仅主键正序排序 189 BEGIN 190 IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 191 BEGIN 192 SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 193 + @TableName + @new_where2 + @PrimaryKey + ' > ' 194 + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP ' 195 + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey 196 + ' FROM ' + @TableName 197 + @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1 198 END 199 ELSE --反向检索 200 BEGIN 201 SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 202 + 'Select TOP ' + STR(@PageSize) + ' ' 203 + @FieldList + ' FROM ' 204 + @TableName + @new_where2 + @PrimaryKey + ' < ' 205 + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP ' 206 + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey 207 + ' FROM ' + @TableName 208 + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2 209 + ' ) AS TMP ' + @new_order1 210 END 211 END 212 IF @SortType = 2 --仅主键反序排序 213 BEGIN 214 IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 215 BEGIN 216 SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 217 + @TableName + @new_where2 + @PrimaryKey + ' < ' 218 + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP ' 219 + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey 220 +' FROM '+ @TableName 221 + @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1 222 END 223 ELSE --反向检索 224 BEGIN 225 SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 226 + 'Select TOP ' + STR(@PageSize) + ' ' 227 + @FieldList + ' FROM ' 228 + @TableName + @new_where2 + @PrimaryKey + ' > ' 229 + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP ' 230 + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey 231 + ' FROM ' + @TableName 232 + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2 233 + ' ) AS TMP ' + @new_order1 234 END 235 END 236 IF @SortType = 3 --多列排序,必须包含主键,且放置最后,否则不处理 237 BEGIN 238 IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0 239 BEGIN PRINT('ERR_02') RETURN END 240 IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 241 BEGIN 242 SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 243 + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 244 + ' Select TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList 245 + ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP ' 246 + @new_order2 + ' ) AS TMP ' + @new_order1 247 END 248 ELSE --反向检索 249 BEGIN 250 SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 251 + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 252 + ' Select TOP ' + STR(@TotalCount-@PageSize *@PageIndex+@PageSize) + ' ' + @FieldList 253 + ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP ' 254 + @new_order1 + ' ) AS TMP ' + @new_order1 255 END 256 END 257 END 258 PRINT(@SQL) 259 EXEC(@Sql) 260 END 261 262 263 GO