Sql Server经典存储过程

来源:互联网 发布:手机淘宝受骗怎么投诉 编辑:程序博客网 时间:2024/05/21 06:44

1.进行多表查询,看用户的信息
CREATE PROCEDURE SP_CLUB_GOMYCLUB
@user_number int,
@user_id varchar(20)
AS
BEGIN
--设置存储过程的脱离时间
SET LOCK_TIMEOUT 1800
BEGIN TRANSACTION
SELECT club_code,club_name FROM club_common_member WITH(NOLOCK) WHERE club_mem_no = @user_number and club_mem_id
=@user_id
UNION
SELECT club_code,club_name FROM club_game_member WITH(NOLOCK) WHERE club_mem_no = @user_number and club_mem_id = @user_id
UNION
SELECT club_code,club_name FROM club_favor_member WITH(NOLOCK) WHERE club_mem_no = @user_number and club_mem_id = @user_id
IF @@ERROR <> 0 OR @@ROWCOUNT = 0
 BEGIN 
  ROLLBACK TRANSACTION
 END
ELSE
 BEGIN
  COMMIT TRANSACTION
 END
END
GO


2.分布式事务处理的存储过程
CREATE PROCEDURE RWA_EX_GIVEAPOINTEX
@Uid       INT,
@User_name  VARCHAR(20),
@User_APoint   INT,
@out_check      VARCHAR(10)  OUTPUT
AS

SET LOCK_TIMEOUT 1500
SET ANSI_WARNINGS ON
SET ANSI_NULLS OFF
--SET @USER_ADD = @APOINT

IF DATALENGTH(@User_name) < 4
 BEGIN
       SET @out_check = '4BYTE'
       RETURN
 END
IF DATALENGTH(@User_name) > 20
 BEGIN
      SET @out_check = '20BYTE'
      RETURN
 END
--开始分布式事务处理
BEGIN DISTRIBUTED TRANSACTION
--查找玩家现有的APOINT值
--SELECT @U_Point =  user_point FROM USER_ITEM  WITH (NOLOCK)  WHERE user_number = @User_id and user_id = @User_Uname

DECLARE @u_point INT
DECLARE @U_TempPoint INT
DECLARE   @PROC_NUMBER  int
set @u_point = 0

select @u_point = user_point  from USER_ITEM WITH (NOLOCK) where user_number = @Uid and user_id = @User_name
SET @U_TempPoint = @u_point + @User_APoint
--print @User_APoint

IF @@ERROR <> 0
 BEGIN
       SET @out_check = 'PROFILE'
       ROLLBACK TRANSACTION
       RETURN
 END
--追加新的橘宝石
SELECT @PROC_NUMBER = @Uid

UPDATE USER_ITEM SET USER_POINT = @U_TempPoint WHERE USER_NUMBER = @Uid AND  USER_ID = @User_name
IF @@ERROR <> 0
 BEGIN
  SET @out_check = 'ITEM'
  ROLLBACK TRANSACTION
  RETURN
 END
SET  XACT_ABORT ON
--写入LOG文件
EXEC G_CRM.JOYON_CRM.avgama.LOG_CREDIT_EX @PROC_NUMBER, @User_name, 1,3, @U_TempPoint, '',0,''
IF @@ERROR<>0 AND @@rowcount <> 1
 BEGIN
  SET @out_check = 6
  ROLLBACK TRANSACTION
  RETURN
 END
ELSE
 BEGIN
  SET @out_check = 'OK'
  COMMIT TRANSACTION
  RETURN
 END
GO

 

3.在服务器端使用游标的实例
CREATE PROCEDURE SP_CLUB_COUNT_UPDATE
AS

DECLARE @CLUB_CODE INT,@Club_L_Index INT,@UPDATE_COUNT INT,@CLUB_COUNT INT
SET @CLUB_CODE = 0
SET @Club_L_Index = 0
SET @UPDATE_COUNT = 0
SET @CLUB_COUNT = 0

DECLARE CUR_ACC Cursor FORWARD_ONLY READ_ONLY For
SELECT CLUB_L_INDEX,CLUB_CODE,CLUB_COUNT FROM CLUB_DATA WITH(NOLOCK)
OPEN CUR_ACC
FETCH NEXT FROM CUR_ACC INTO @CLUB_L_INDEX,@CLUB_CODE,@CLUB_COUNT
WHILE(@@FETCH_STATUS = 0)
BEGIN
 

 IF @Club_L_Index = 2
  BEGIN
   BEGIN TRANSACTION
   SELECT  @UPDATE_COUNT = COUNT(CLUB_CODE) FROM CLUB_COMMON_MEMBER  with(nolock)
   WHERE CLUB_CODE = @CLUB_CODE AND CLUB_MEM_LEVEL <4
   IF @@ERROR  <> 0
    BEGIN
     ROLLBACK TRANSACTION
    END 

   UPDATE CLUB_DATA SET CLUB_COUNT = @UPDATE_COUNT WHERE CLUB_CODE = @CLUB_CODE
   IF @@ERROR  <> 0
    BEGIN
     ROLLBACK TRANSACTION
    END


   ELSE 
    BEGIN
     COMMIT TRANSACTION 
     PRINT @CLUB_COUNT
     PRINT @UPDATE_COUNT
    END

  END

 ELSE IF @Club_L_Index =1
  BEGIN
   BEGIN TRANSACTION  
   SELECT  @UPDATE_COUNT = COUNT(CLUB_CODE) FROM CLUB_GAME_MEMBER  with(nolock)
   WHERE CLUB_CODE = @CLUB_CODE AND CLUB_MEM_LEVEL <4
   IF @@ERROR  <> 0
    BEGIN
     ROLLBACK TRANSACTION
    END

   ELSE 
    BEGIN
     COMMIT TRANSACTION 
    END
  END
 ELSE IF @Club_L_Index =3
  BEGIN
   BEGIN TRANSACTION  
   SELECT  @UPDATE_COUNT = COUNT(CLUB_CODE) FROM CLUB_FAVOR_MEMBER  with(nolock)
   WHERE CLUB_CODE = @CLUB_CODE AND CLUB_MEM_LEVEL <4
   IF @@ERROR  <> 0
    BEGIN
     ROLLBACK TRANSACTION
    END

   ELSE 
    BEGIN
     COMMIT TRANSACTION 
    END
  END   

FETCH NEXT FROM CUR_ACC INTO @CLUB_L_INDEX,@CLUB_CODE,@CLUB_COUNT
END
CLOSE CUR_ACC
DEALLOCATE CUR_ACC

GO


4.对时间类型的统计方法,按年,按月,按日
SELECT COUNT(user_number) AS Expr1,datepart(dd,user_login_time)
-- convert(char(10), user_login_time, 120) AS Expr1
FROM RAS_ACCESS_130032
--where datediff(mm,user_login_time,user_login_time)=0 and datediff(mm,user_login_time,user_login_time)=0
GROUP BY datepart(dd,user_login_time)--,datepart(dayofyear,user_login_time)
--having


方法2
SELECT COUNT(user_number) AS Expr2,
convert(char(10), user_login_time, 120) AS Expr1
FROM RAS_ACCESS_130032
GROUP BY convert(char(10), user_login_time, 120)
月:
SELECT COUNT(user_number) AS Expr2,
convert(char(7), user_login_time, 120) AS Expr1
FROM table
GROUP BY convert(char(7), user_login_time, 120)
年:
SELECT COUNT(user_number) AS Expr2,
convert(char(4), user_login_time, 120) AS Expr1
FROM table
GROUP BY convert(char(4), user_login_time, 120)

 

5.关于杀死进程的存储过程调用方法
sp_who [[@login_name =] 'login']
KILL {spid | UOW} [WITH STATUSONLY]

 

6.关于如何实现不定表名的查询
SET @sql = 'SELECT @proc_login = USER_STATE FROM RAS_ACCESS_'+ @Service_SN + '   WHERE USER_NUMBER = ' + cast(@user_number as varchar) + ' and user_id = ''' + @user_id + ''' '
SET @Parmdefinition =
'@proc_login  int OUTPUT'
EXECUTE sp_executesql @sql, @ParmDefinition, @proc_login = @proc_login OUTPUT


CREATE  PROCEDURE User_Level_Validate
@User_id as int,
@User_Name as varchar(20),
@User_GameCode varchar(2),
@Results as varchar(20) OUTPUT
AS
--开始执行分布式查询
BEGIN DISTRIBUTED TRANSACTION

DECLARE @User_GamePoint as bigint
DECLARE @User_Level as int
DECLARE @User_Pev as bigint
DECLARE @User_Next as bigint
DECLARE @SQL as nvarchar(500)

--查询玩家在游戏中的内容信息
SET @SQL = N'SELECT @User_GamePoint = Game_P_Point,@User_Level = Game_P_Level from Game_P_' + @User_GameCode + ' where Game_User_Number = ' + cast(@User_id as varchar(10)) + ' and Game_P_Id = ''' + @User_Name + ''''

EXECUTE sp_executesql @SQL,N'@User_GamePoint bigint OUTPUT,@User_Level int OUTPUT',@User_GamePoint=@User_GamePoint output,@User_Level = @User_Level output
IF @@ROWCOUNT <> 1 OR @@ERROR <> 0
    BEGIN
 SET @Results = 'Select Error'
 ROLLBACK TRANSACTION
 RETURN
    END
--如果玩家是0级 退出
IF @User_Level <= 0
    BEGIN
             SET @Results = 'User Level 0'
 ROLLBACK TRANSACTION
 RETURN
    END
ELSE
--开始计算点数
    BEGIN
              WHILE (@User_Level > 0)
              BEGIN
         SELECT @User_Pev = buy_money,@User_Next = sell_money FROM GAME_GRADE WHERE  grade_num = @User_Level
                      IF @@error<>0 or @@rowcount<>1
                      BEGIN
                           SET @Results = 'GRADE Error'
               ROLLBACK TRANSACTION
               RETURN   
                      END 
                      SET @User_GamePoint = @User_GamePoint - @User_Next + @User_Pev
                      IF @User_GamePoint <= 0
                      BEGIN
                           SET @Results = 'Point is 0'
               ROLLBACK TRANSACTION
               RETURN                          
                      END
                      SET @User_Level = @User_Level - 1 
                     --SET  XACT_ABORT ON
                     --写入LOG文件
                     --EXEC G_CRM.JOYON_CRM.avgama.LOG_CREDIT_EX @User_id, @User_Name, 2,53, @User_Next, '',0,''
                     --EXEC G_CRM.JOYON_CRM.avgama.LOG_CREDIT_EX @User_id, @User_Name, 2,52, @User_Pev, '',0,''
              END
    END
    SET @Results = 'Ok'
    COMMIT TRANSACTION
GO

7.SQLSERVER的反向匹配
CREATE PROCEDURE DirtyValidate
@User_text varchar(20),
@Results varchar(20) OUTPUT
AS
--启动事务处理
BEGIN TRANSACTION

DECLARE @Str_Temp varchar(20)
DECLARE @Int_Row as int
SELECT dname FROM dirtyname  WHERE @User_text Like '%' + dname + '%'
SET @Int_Row = @@rowcount
IF @@error<>0
BEGIN 
     SET @Results ='Select Error'
     ROLLBACK TRANSACTION
     RETURN
END

IF @Int_Row > 0
BEGIN
    SET @Results ='YES'
    COMMIT TRANSACTION
END
ELSE
BEGIN
    SET @Results ='NO'
    COMMIT TRANSACTION
END
--声明一个服务器端游标
/*DECLARE CUR_ACC CURSOR FORWARD_ONLY READ_ONLY FOR

SELECT dname FROM dirtyname 
IF @@error<>0
BEGIN 
     SET @Results ='Select Error'
     ROLLBACK TRANSACTION
     RETURN
END
--开始使用游标遍历数据库
OPEN CUR_ACC
FETCH NEXT FROM CUR_ACC INTO @Str_Temp
WHILE (@@FETCH_STATUS = 0)
BEGIN
 IF @@ERROR  <> 0
             BEGIN
      SET @Results ='While Error'
                  ROLLBACK TRANSACTION   
             END
             ELSE
             --开始比较
             BEGIN
                  --IF SUBSTRING(@Str_Temp,)
                  COMMIT TRANSACTION
             END 
                        
END
CLOSE CUR_ACC
DEALLOCATE CUR_ACC */
GO

--关于存储过程控制的翻页程序
 SET @sql = 'SELECT TOP ' + CONVERT(VARCHAR(10), @pSize) + ' RCH_SEQ,RCH_ITEMCODE,RCH_MONEY,RCH_GAME_POINT,USER_NUMBER,USER_ID,RCH_STATE,RCH_RS_DATE,RCH_RQ_DATE,  Item.RCI_Name '
  + 'FROM (SELECT TOP ' + CONVERT(VARCHAR(10), (@tRecordsCount-(@page-1)*@pSize)) + ' RCH_SEQ,RCH_ITEMCODE,RCH_MONEY,RCH_GAME_POINT,USER_NUMBER,USER_ID,RCH_STATE,RCH_RS_DATE,RCH_RQ_DATE '
  + 'FROM ' + @table + ' '

 

原创粉丝点击