動態SQL應用小列子 (轉)
呵呵,幾乎成標題黨了,今天要寫個指令碼查詢7天內所有有登入玩家的資料,要求按註冊日期統計,雖然是個簡單的問題,但是關鍵是使用者表有30個,分別是user0, user1......到user29 ,光是把它們UNION ALL起來,我都夠鬱悶了,你想象下指令碼有多長吧,一大堆堆在那兒,光是複製都讓你難以忍受。
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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
.........
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/-->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()) ';
--PRINT @cmdText
EXEC (@cmdText);
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 動態SQL中DESCRIPTOR的應用 (轉)SQL
- 動態SQL語句 (轉)SQL
- 用動態SQL語句SQL
- 給你的應用程式新增動態滑鼠 (轉)
- LINUX動態連結庫高階應用(轉)Linux
- iptables應用之動態DNS(轉)DNS
- AASubviews - 自動排列子檢視View
- oracle動態sql語句處理(轉)OracleSQL
- 動態載入!dom應用!
- 動態SQLSQL
- 動態SQL intoSQL
- Win2000動態DNS的安全應用策略(轉)DNS
- Shell的五個小應用(轉)
- SQL 如何實現動態的行列轉置SQL
- 動態代理的實際應用
- 動態代理的原理及其應用
- 動態record陣列的應用陣列
- 埠複用動態地址轉換
- 用 PHP 動態建立 Flash 動畫 (轉)PHP動畫
- MyBatis 動態 SQLMyBatisSQL
- MybBatis動態SQLBATSQL
- Mybatics動態sqlBATSQL
- ABAP 動態 SQLSQL
- Oracle 動態SQLOracleSQL
- mybatis動態SQLMyBatisSQL
- 四個PHP應用小函式 (轉)PHP函式
- PLSQL Language Referenc-PL/SQL動態SQL-何時需要動態SQLSQL
- Flutter 動態更改應用程式啟動圖示Flutter
- PL/SQL執行動態SQLSQL
- 動態修改應用icon和name
- Objective-C 動態特性應用指南Object
- 動態磁貼 與 觸控應用
- PL/SQL中動態掉用儲存過程SQL儲存過程
- (轉):學習Oracle動態效能表-(6)-V$SQL,V$SQL_PLANOracleSQL
- 黑科技:把第三方 iOS 應用轉成動態庫iOS
- 1 Mybatis動態SQLMyBatisSQL
- Mybatis--動態SQLMyBatisSQL
- MyBatis(七) 動態SQLMyBatisSQL