首页 > 其他 > 详细

存储过程

时间:2014-08-26 19:29:56      阅读:308      评论:0      收藏:0      [点我收藏+]

提前这个存储过程,真的是让我心里很是委屈,做开发这么久了,我竟然不会存储过程,纠结了我两天,下面就来看看存储过程

存储过程就是一种特殊的函数,基本上没有返回值,如果要有返回值,则必须是0,1

存储过程是存放在服务器端的,一旦存储过程建立之后,则以后就可以随时使用,不在进行编译了

创建存储过程

Create Proc Pro_Table  //创建一个存储过程

(@UserId Int) // 定义参数

as

Begin

Declare @Sql Navrchar(2000);  // 声明一个变量

set @Sql=‘select * from car‘;

Exec(@Sql) //执行存储过程

Print(@Sql)   //打印

End

Go

带分页的存储过程,这个这么我好久了

Alter proc  Pro_CarComment
(
@UserId int,
@PageSize int,                     --每页多少条记录
@PageIndex int = 1 ,               --指定当前为第几页
@TotalRecord int output,            --返回总记录数
@TotalPageCount int output         --返回总页数
)
as
Begin

Declare @StartRecord int;
Declare @EndRecord int;
Declare @TotalCountSql nvarchar(500);
Declare @SqlString nvarchar(2000);
set @StartRecord =(@PageIndex-1)*@PageSize+1
set @EndRecord =@StartRecord +@PageSize-1
set @TotalCountSql=select count(*) from (select cm.id,cm.Content,cm.CarId ,cm.CreateTime from
(SELECT   UserProfileId,[carid],max(id) as id
FROM [BusinessData].[dbo].[CarComment]
group by [carid],  UserProfileId) as temp ,[CarComment] as cm
where  temp.CarId=cm.CarId  and temp.id=cm.id)temp2,car as c
where temp2.CarId=c.Id and c.UserId=+CAST( @UserId as varchar)
set @SqlString=select,row_number() over (order by desc) as rowId, c.id as cid,c.carname,temp2.Id as cmid,temp2.content,temp2.CreateTime as cmtime from
(select cm.id,cm.Content,cm.CarId ,cm.CreateTime from
(SELECT   UserProfileId,[carid],max(id) as id
FROM [BusinessData].[dbo].[CarComment]
group by [carid],  UserProfileId) as temp ,[CarComment] as cm
where  temp.CarId=cm.CarId  and temp.id=cm.id)temp2,car as c
where temp2.CarId=c.Id and c.UserId=+CAST( @UserId as varchar)

EXEC sp_executesql @totalCountSql,N@TotalRecord int out,@TotalRecord output;--返回总记录数

set @TotalPageCount=(@TotalRecord+@PageSize-1)/@PageSize
set @SqlString =select * from (+@SqlString+)as t where rowId between +ltrim(str(@StartRecord))+ and + ltrim(str(@EndRecord));

Exec(@SqlString)    
    print @SqlString
    print @TotalRecord
    print @TotalPageCount
    end
    Go

下面在记一个通用的分页存储过程

ALTER(Create) procedure [dbo].[p_fen_ye] @table varchar(20),@id varchar(20),@orderby int,@pagesize int,@pageno int,@iswhere int,@where varchar(500)
as
declare @by varchar(10)
set @by=asc
if(@orderby=1)
begin
set @by=desc;
end
declare @start varchar(10);
set @start = cast(((@pageno-1)*@pagesize) as varchar);
declare @sql varchar(500);
if(@iswhere!=0)
begin
set @sql=select top +cast(@pagesize as varchar)+ * from +@table+ where +@id+ not in (select top +@start+ +@id+ from +@table+ where +@where+ order by +@id+ +@by+) and +@where+ order by +@id+ +@by;
end
else
begin
set @sql=select top +cast(@pagesize as varchar)+ * from +@table+ where +@id+ not in (select top +@start+ +@id+ from +@table+ order by +@id+ +@by+) order by +@id+ +@by;
end
execute (@sql)

这个还有一个朋友给我的通用的分页存储过程,只需要传2个参数

CREATE   PROCEDURE Pro_CarComment
@page_size int ,--页面大小
@current_page int  output-- 当前第几页
as 
begin 
     declare @page_count int--页面总数
     declare @last_page  int--尾页
     declare @first_page   int--首页
     declare @sql nvachar(2000) 
    select @page_count =  COUNT(*) from Employee 
     if( @page_count %@page_size=0)
        begin
          set @last_page = @page_count / @page_size
         end
      if (@page_count %@page_size !=0)
         begin
         set @last_page = @page_count/@page_size +1
          end
     if ( @current_page <=0)
      begin 
          select  @first_page=1, @current_page = @first_page
         end 
      if (@current_page >= @last_page)
        begin
          set @current_page= @last_page
         end 
    select  top(@page_size) *
   from Employee where Employee_no not in ( select  top(@page_size * (@current_page-1)) Employee_no from  Employee )
end

依个人习惯创建分页存储过程,再追加一个吧,目前简单的存储过程会创建了

-创建分页存储过程
-------------------------------------------------------------------
CREATE PROC [dbo].[sp_PageView]
    @tbname SYSNAME ,               --要分页显示的表名   
    @FieldKey NVARCHAR(1000) ,      --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段   
    @PageCurrent INT = 1 ,               --要显示的页码   
    @PageSize INT = 10 ,                --每页的大小(记录数)   
    @FieldShow NVARCHAR(1000) = ‘‘ ,      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段   
    @FieldOrder NVARCHAR(1000) = ‘‘ ,      --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC   用于指定排序顺序   
    @Where NVARCHAR(1000) = ‘‘ ,     --查询条件   
    @RecordCount INT OUTPUT             --总页数   
AS 
    DECLARE @PageCount AS INT
    SET NOCOUNT ON   
--检查对象是否有效   
    IF OBJECT_ID(@tbname) IS NULL 
        BEGIN   
            RAISERROR(N对象"%s"不存在,1,16,@tbname)   
            RETURN   
        END   
    IF OBJECTPROPERTY(OBJECT_ID(@tbname), NIsTable) = 0
        AND OBJECTPROPERTY(OBJECT_ID(@tbname), NIsView) = 0
        AND OBJECTPROPERTY(OBJECT_ID(@tbname), NIsTableFunction) = 0 
        BEGIN   
            RAISERROR(N"%s"不是表、视图或者表值函数,1,16,@tbname)   
            RETURN   
        END   
   
--分页字段检查   
    IF ISNULL(@FieldKey, N‘‘) = ‘‘ 
        BEGIN   
            RAISERROR(N分页处理需要主键(或者惟一键),1,16)   
            RETURN   
        END   
   
--其他参数检查及规范   
    IF ISNULL(@PageCurrent, 0) < 1 
        SET @PageCurrent = 1   
    IF ISNULL(@PageSize, 0) < 1 
        SET @PageSize = 10   
    IF ISNULL(@FieldShow, N‘‘) = N‘‘ 
        SET @FieldShow = N*   
    IF ISNULL(@FieldOrder, N‘‘) = N‘‘ 
        SET @FieldOrder = N‘‘   
    ELSE 
        SET @FieldOrder = NORDER BY  + LTRIM(@FieldOrder)   
    IF ISNULL(@Where, N‘‘) = N‘‘ 
        SET @Where = N‘‘   
    ELSE 
        SET @Where = NWHERE ( + @Where + N)   
   
--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)   
    IF @PageCount IS NULL 
        BEGIN   
            DECLARE @sql NVARCHAR(4000)   
            SET @sql = NSELECT @RecordCount=COUNT(*) + N FROM  + @tbname
                + N  + @Where   
            EXEC sp_executesql 
                @sql ,
                N@RecordCount int OUTPUT ,
                @RecordCount OUTPUT   

            SET @PageCount = ( @RecordCount + @PageSize - 1 ) / @PageSize   
        END   
   
--计算分页显示的TOPN值   
    DECLARE
        @TopN VARCHAR(20) ,
        @TopN1 VARCHAR(20)   
    SELECT
        @TopN = @PageSize ,
        @TopN1 = ( @PageCurrent - 1 ) * @PageSize   
   
--第一页直接显示   
    IF @PageCurrent = 1 
        EXEC(NSELECT TOP +@TopN   
        +N +@FieldShow   
        +N FROM +@tbname   
        +N +@Where   
        +N +@FieldOrder)   
    ELSE 
        BEGIN   
    --处理别名   
            IF @FieldShow = N* 
                SET @FieldShow = Na.*   
   
    --生成主键(惟一键)处理条件   
            DECLARE
                @Where1 NVARCHAR(4000) ,
                @Where2 NVARCHAR(4000) ,
                @s NVARCHAR(1000) ,
                @Field SYSNAME   
            SELECT
                @Where1 = N‘‘ ,
                @Where2 = N‘‘ ,
                @s = @FieldKey   
            WHILE CHARINDEX(N,, @s) > 0 
                SELECT
                    @Field = LEFT(@s, CHARINDEX(N,, @s) - 1) ,
                    @s = STUFF(@s, 1, CHARINDEX(N,, @s), N‘‘) ,
                    @Where1 = @Where1 + N AND a. + @Field + N=b. + @Field ,
                    @Where2 = @Where2 + N AND b. + @Field + N IS NULL ,
                    @Where = REPLACE(@Where, @Field, Na. + @Field) ,
                    @FieldOrder = REPLACE(@FieldOrder, @Field, Na. + @Field) ,
                    @FieldShow = REPLACE(@FieldShow, @Field, Na. + @Field)   
            SELECT
     --@Where=REPLACE(@Where,@s,Na.+@s),   
                @FieldOrder = REPLACE(@FieldOrder, @s, Na. + @s) ,
                @FieldShow = REPLACE(@FieldShow, @s, Na. + @s) ,
                @Where1 = STUFF(@Where1 + N AND a. + @s + N=b. + @s, 1, 5,
                                N‘‘) ,
                @Where2 = CASE WHEN @Where = ‘‘ THEN NWHERE (
                               ELSE @Where + N AND (
                          END + Nb. + @s + N IS NULL + @Where2 + N)   
    --执行查询 
  
            EXEC(NSELECT TOP +@TopN   
            +N +@FieldShow   
            +N FROM +@tbname   
            +N a LEFT JOIN(SELECT TOP +@TopN1   
            +N +@FieldKey   
            +N FROM +@tbname   
            +N a +@Where   
            +N +@FieldOrder   
            +N)b ON +@Where1   
            +N +@Where2   
            +N +@FieldOrder)   
        END   

 

存储过程

原文:http://www.cnblogs.com/llxy/p/3937672.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!