動態SQL應用小列子 (轉)

iSQlServer發表於2010-08-18
呵呵,幾乎成標題黨了,今天要寫個指令碼查詢7天內所有有登入玩家的資料,要求按註冊日期統計,雖然是個簡單的問題,但是關鍵是使用者表有30個,分別是user0, user1......到user29 ,光是把它們UNION ALL起來,我都夠鬱悶了,你想象下指令碼有多長吧,一大堆堆在那兒,光是複製都讓你難以忍受。 
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtSELECT 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 改寫的,呵呵,簡潔多了

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtDECLARE @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()) ';
--PRINT     @cmdText    
EXEC (@cmdText);

 

這裡得提提 CHAR(10)這個,個人感覺非常有用,剛開始的時候,沒有加換行符,把這段指令碼輸出的時候,格式比較亂,很多時候,複雜的動態指令碼,都需要輸出,檢視,除錯一番, 就像PRINT     @cmdText   那樣,如果輸出格式比較亂,自己調整需要花費一定功夫,在寫的時候,如果注意指令碼格式了,那就要省很多功夫了。而且也有助於以後維護,修改。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-671262/,如需轉載,請註明出處,否則將追究法律責任。

相關文章