动态SQL应用小列子

 呵呵,几乎成标题党了,今天要写个脚本查询7天内所有有登录玩家的数据,要求按注册日期统计,虽然是个简单的问题,但是关键是用户表有30个,分别是user0, user1......到user29 ,光是把它们UNION ALL起来,我都够郁闷了,你想象下脚本有多长吧,一大堆堆在那儿,光是复制都让你难以忍受。 

SELECT  Id, CONVERT ( VARCHAR ( 10 ),Create_Time,  120 ), Last_Login_Time  FROM  user0
UNION   ALL
SELECT  Id, CONVERT ( VARCHAR ( 10 ),Create_Time,  120 ), Last_Login_Time  FROM  user1
UNION   ALL
SELECT  Id, CONVERT ( VARCHAR ( 10 ),Create_Time,  120 ), Last_Login_Time  FROM  user2
.........

 

 呵呵,下面是我用动态SQL 改写的,呵呵,简洁多了

DECLARE   @cmdText   VARCHAR ( 8000 );
DECLARE   @userIndex   INT ;
SET   @cmdText   =   '' ;
SET   @userIndex   =   0 ;
WHILE   @userIndex   < 30
BEGIN
    
IF  ( @userIndex   !=   29 )
            
SELECT   @cmdText   =   @cmdText   +   ' SELECT Id,Create_Time, Last_Login_Time FROM  '  
                         
+   '   dbo.user '   +   CONVERT ( VARCHAR , @userIndex
                         
+   '   UNION ALL '   +   CHAR ( 10 );  -- 换行
     ELSE
            
SELECT   @cmdText   =   @cmdText   +   ' SELECT Id,Create_Time, Last_Login_Time FROM  '
                         
+    ' dbo.user '   +   CONVERT ( VARCHAR , @userIndex ) ;
    
    
SET   @userIndex   =   @userIndex   +   1 ;
END ;

SELECT   @cmdText   =   ' SELECT CONVERT(VARCHAR(10),T.Create_Time, 120) AS Create_Time ,COUNT(0) AS RecordNum FROM ( '  
            
+   @cmdText   +  
            
' ) T WHERE DATEDIFF(d,Last_Login_Time,GETDATE()) < 7 GROUP BY CONVERT(VARCHAR(10),Create_Time, 120)  ' ;
-- PRINT     @cmdText    
EXEC  ( @cmdText );

 

这里得提提 CHAR(10)这个,个人感觉非常有用,刚开始的时候,没有加换行符,把这段脚本输出的时候,格式比较乱,很多时候,复杂的动态脚本,都需要输出,查看,调试一番, 就像PRINT     @cmdText   那样,如果输出格式比较乱,自己调整需要花费一定功夫,在写的时候,如果注意脚本格式了,那就要省很多功夫了。而且也有助于以后维护,修改。

转载于:https://www.cnblogs.com/kerrycode/archive/2010/07/21/1782047.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值