表变量的操作

1.申明一个表变量


  1. ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser]AS  
  2. BEGIN      
  3.     DECLARE @resultTemp TABLE(UserID INT,DealCustomerCount INT--申明表变量         
  4.     INSERT INTO @resultTemp    --往表变量添加数据  
  5.     SELECT UserID,COUNT(DISTINCT TempCustomerID) AS DealCustomerCount    
  6.     FROM CRM_Log_CheckTempCustomer 
  7.     GROUP BY UserID 
  8.     ORDER BY UserID;  
  9. END  

2.表变量添加自增序列。


  1. ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser]AS  
  2. BEGIN      
  3.   
  4.   
  5.      DECLARE @result TABLE(UserID INT,DealCustomerCount INT,Serial INT)--添加Serial字段作为自增序列  
  6.     INSERT INTO @result --ROW_NUMBER() OVER(ORDER BY UserID) 按UserID排序由1开始自增  
  7.   
  8.    SELECT DISTINCT UserID,0 AS DealCustomerCount,Serial=row_number() over(ORDER BY UserID)     FROM CRM_Log_CheckTempCustomer 
  9.    WHERE UpdateTime>=@fromDate AND UpdateTime<@toDate     
  10.    GROUP BY UserID 
  11.    ORDER BY UserID;  
  12. END  

3.按时间一天一天的循环。


  1. ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser] --某段时间范围内,每一天的客户处理数进行累加  
  2. @toDate   datetime,  
  3. @fromDate datetime  
  4. AS  
  5.  SET NOCOUNT ON;  
  6.  DECLARE @toDateTemp datetime  
  7.  DECLARE @fromDateTemp datetime  
  8.  SET @fromDateTemp=@fromDate  
  9.  WHILE @fromDateTemp<@toDate  --循环开始,起始时间一天天的推移,直到超过结束时间,这时循环结束。  
  10.   
  11.  BEGIN    --------------------------------业务开始,请自动忽略------------------------------  
  12.      SET @toDateTemp=DATEADD(DAY,1,@fromDateTemp)  --当前一天的结束时间为当前起始时间+1  
  13.      IF(@toDateTemp>=@toDate)  --当前一天的结束时间,大于结束时间的上限,重置为结束时间上限  
  14.   
  15.      BEGIN  
  16.          SET @toDateTemp=@toDate  
  17.      END  
  18.      --查询当前一天的客户处理数  
  19.       SELECT @currentDealCustomerCount=COUNT(DISTINCT TempCustomerID)     
  20. FROM CRM_Log_CheckTempCustomer  
  21.      WHERE UserID=@userID AND UpdateTime>=@fromDateTemp AND UpdateTime<@toDateTemp;  
  22.      --累加当前一天的客户处理数,最终循环结束时,可以得到该段时间范围内每一天客户处理数的统计  
  23.       SET @dealCustomerCount=@dealCustomerCount+@currentDealCustomerCount   
  24.  --------------------------------业务结束,请自动忽略------------------------------  
  25.   
  26.      SET @fromDateTemp=DATEADD(DAY,1,@fromDateTemp)--起始时间+1推移,直到大于结束时间,结束循环  
  27.   
  28.  END  
  29.  SELECT @dealCustomerCount AS DealCustomerCount  

 4.按表变量的长度进行循环,并可以操作表变量本身

  1. ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser]   
  2.  AS  
  3.  BEGIN  
  4.  SET NOCOUNT ON;  
  5.  DECLARE @currentDealCustomerCount INT  
  6.  DECLARE @rows INT  
  7.  DECLARE @result TABLE(UserID INT,DealCustomerCount INT,Serial INT)    
  8.  INSERT INTO @result   
  9.  SELECT DISTINCT UserID,0 AS DealCustomerCount,Serial=row_number() over(ORDER BY UserID)   
  10.  FROM CRM_Log_CheckTempCustomer   
  11.  WHERE UpdateTime>=@fromDate AND UpdateTime<@toDate 
  12.  GROUP BY UserID 
  13.  ORDER BY UserID;  
  14.  SET @rows=@@RowCount  --如果上一个操作添加8条操作,@@RowCount数值便是8  
  15.   
  16.  --循环开始,当@rows-1递减,直到为0,循环结束 
  17.  --这里自增序号Serial和@rows是一致,每一次循环对应一个自增值,由此可以对@result操作  
  18.  WHILE @rows>0  
  19.  BEGIN  
  20.      SET @currentDealCustomerCount=0  
  21.      SELECT @currentDealCustomerCount=DealCustomerCount 
  22. FROM @result    
  23. WHERE Serial=@rows  
  24.   
  25.      IF @currentDealCustomerCount>0  
  26.      BEGIN  
  27.          UPDATE @result SET DealCustomerCount=DealCustomerCount+@currentDealCustomerCount      
  28.          WHERE Serial=@rows  
  29.      END   
  30.               SET @rows=@rows-1 --当@rows减到0,结束循环  
  31. END   
  32. END  

5.判断表变量是否为空。

  1. SELECT @resultTempCount=COUNT(1) FROM @resultTemp  
  2. IF(@resultTempCount>0)  
  3. BEGIN  
  4.     ......  
  5. END  

作者:焱龙
出处:http://star-studio.cnblogs.com/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值