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