SQL 存储过程(示例)

USE [MyDataBase]
GO
/****** Object:  StoredProcedure [dbo].[GetVipDetails]    Script Date: 07/05/2012 09:39:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Proc [dbo].[GetVipDetails]
    @pageindex int=1 ,
    @pagesize int=10, 
    @VipAccount nvarchar(20)=null,  --VIP账户
    @VipCompanyUserID bigint=null,   --VIP用户的公司用户ID
    @ProxyCompanyID bigint=null,   --渠道商公司ID/云平台公司ID
    @ProxyManagerID bigint=null,   --业务经理ID
    @ProxyCompanyUserID bigint=null   --业务员ID
    as 
        declare @SqlStr varchar(4000) --要插入数据到临时表执行的SQL
        declare @sqlstr2 varchar(2000)  -- 要插入数据到临时表的条件        
        declare @SqlStr3 varchar(4000)  --pageindex为1时不带条件的sql
        declare @SqlStr4 varchar(2000)   --条件组合的sql
        declare @SqlStr5 varchar(4000)    --pageindex > 1时要执行的sql
        declare @ResultSql varchar(4000)   --最终要执行的sql
        declare @OutCountSql varchar(1000)   --输出总记录的sql
begin
        --创建临时数据表
        create table #TempVipDetails
        (
            ID bigint primary key ,
            VIPAccount nvarchar(20),
            CompanyUserID bigint,
            UserID bigint,
            CompanyID bigint,
            CompanyName nvarchar(250),
            [Status] bit,
            IsAssignedChannel bit,
            IsAssignedManager bit,
            IsAssignedUser bit,
            ProxyCompanyID bigint,
            ProxyManagerID bigint,
            AssignManagerDateTime datetime,
            ProxyCompanyUserID bigint,
            AssignUserDateTime datetime,
            UserName nvarchar(20),
            RealName nvarchar(20),
            Sex int,
            OICQ nchar(20),
            Email nvarchar(50),
            MobileNumber1 nvarchar(15),
            Brthday datetime,
            HomeAddress nvarchar(200),
            OfficeAddress nvarchar(200),
            OfficeNumber nvarchar(20),
            HomePhoneNumber nvarchar(20),
            ProxyCompanyName nvarchar(250),
            ProxyManagerName nvarchar(20),
            ProxyUserName nvarchar(20),
            IsUsed bit
        )
    begin
        set @sqlstr2=' 1 = 1 '
        if @VipAccount is not null
            begin
                set @sqlstr2+=' and VIPAccount = '''+@VipAccount+''''
            end
        else if @VipCompanyUserID>0
            begin
                set @sqlstr2+=' and VipCompanyUserID ='+STR(@VipCompanyUserID)
            end
        set
        @SqlStr='insert into #TempVipDetails
                    (
                        ID,
                        VIPAccount,
                        CompanyUserID,
                        CompanyID,
                        [Status],
                        IsAssignedChannel,
                        IsAssignedManager,
                        IsAssignedUser,
                        IsUsed
                    )
                    select 
                        ID,
                        VIPAccount,
                        VipCompanyUserID,
                        CompanyID,
                        [Status],
                        IsAssignedChannel,
                        IsAssignedManager,
                        IsAssignedUser,
                        IsUsed
                    from SSIP_VIPAccount
                    where '+@sqlstr2
    end
    print @SqlStr;
    exec(@SqlStr);--执行SQL 添加vip数据操作
    
    --更新vip与渠道商运营商关系数据
    update a set 
            a.ProxyCompanyID=b.ProxyCompanyID,
            a.ProxyManagerID=b.ProxyManagerID,
            a.AssignManagerDateTime=b.AssignManagerDateTime,
            a.ProxyCompanyUserID=b.ProxyCompanyUserID,
            a.AssignUserDateTime=b.AssignUserDateTime
        from #TempVipDetails as a,[ssip_vipusersproxy] as b
        where a.CompanyUserID=b.CompanyUserID
        
    --更新 用户公司基本数据操作
    update a set 
            a.CompanyName=b.CompanyName
        from #TempVipDetails as a,[SSIP-SSO].[dbo].[SSO_Company] as b
        where a.CompanyID=b.CompanyID
        
    --更新用户基本数据
    update a set 
            a.UserID=b.UserID,
            a.UserName=b.UserName,
            a.RealName=b.RealName,
            a.Sex=b.Sex,
            a.OICQ=b.OICQ,
            a.Email=b.Email,
            a.MobileNumber1=b.MobileNumber1,
            a.Brthday=b.Brthday,
            a.HomeAddress=b.HomeAddress,
            a.OfficeAddress=b.OfficeAddress,
            a.OfficeNumber=b.OfficeNumber,
            a.HomePhoneNumber=b.HomePhoneNumber
        from #TempVipDetails as a,[SSIP-SSO].[dbo].[SSO_CompanyUsers] as b
        where a.CompanyUserID=b.CompanyUserID
        
    --更新渠道商公司名称
    update a set
        a.ProxyCompanyName=b.CompanyName
        from #TempVipDetails as a , [SSIP-SSO].[dbo].[SSO_Company] as b
        where a.ProxyCompanyID=b.CompanyID
    --更新业务经理名称
    update a set
        a.ProxyManagerName=b.RealName
        from #TempVipDetails as a,[SSIP-SSO].[dbo].[SSO_Users] as b
        where a.ProxyManagerID=b.UserID
    --更新业务员姓名
    update a set
        a.ProxyUserName=b.RealName
        from #TempVipDetails as a,[SSIP-SSO].[dbo].[SSO_Users] as b
        where a.ProxyCompanyUserID=b.UserID
        
    set 
    @SqlStr3='select top '+STR(@pagesize)+' * from #TempVipDetails where 1 = 1 '
    
    set
    @SqlStr4=''    
    if @ProxyCompanyID>0
        begin
            set @SqlStr4+=' and ProxyCompanyID = '+STR(@ProxyCompanyID)
        end
    else if @ProxyManagerID>0
        begin
            set @SqlStr4+=' and ProxyManagerID = '+STR(@ProxyManagerID)
        end
    else if @ProxyCompanyUserID>0
        begin
            set @SqlStr4+=' and ProxyCompanyUserID = '+STR(@ProxyCompanyUserID)
        end
    set 
    @SqlStr5=' select top ('+STR(@pagesize)+') * from (
                select  ROW_NUMBER() over(order by ID) as RowNum,* 
                from #TempVipDetails
                where 1 = 1 '+@SqlStr4+'
                ) as VipDetailsInfo
                where VipDetailsInfo.RowNum >'+str((@pageindex-1)*@pagesize)+'
                and VipDetailsInfo.RowNum <= '+STR(@pageindex*@pagesize)
    set 
    @OutCountSql ='select COUNT(1) from #TempVipDetails where 1 = 1 '+@SqlStr4
    --查询结果
    if @pageindex<=1
        begin
            set @ResultSql=@SqlStr3+@SqlStr4    
            exec (@ResultSql)        --执行sql语句            
            exec (@OutCountSql)    --查询所有总数
        end
    else if @pageindex>1
        begin
            set @ResultSql=@SqlStr5
            exec (@ResultSql)    --执行sql语句
            exec (@OutCountSql)    --查询所有总数
        end
                
    --删除临时表
    drop table #TempVipDetails
end
原文地址:https://www.cnblogs.com/wangbogo/p/2585060.html