程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQLServer Top語句參數化辦法

SQLServer Top語句參數化辦法

編輯:MSSQL

SQLServer Top語句參數化辦法。本站提示廣大學習愛好者:(SQLServer Top語句參數化辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer Top語句參數化辦法正文


declare @TopCount int
set @TopCount = 100
select top (@TopCount) * from AdventureWorks.HumanResources.Employee

假如有Like等字句,必定要拼Sql的話,也應當應用sp_executesql來履行,示例以下:

declare @TopCount int --界說top 數目
set @TopCount = 100
declare @Title nvarchar(100) --界說like內容
set @Title = '%n%'
declare @SelectSql nvarchar(max)
set @SelectSql = '
select top (@TopCountPar) *
from AdventureWorks.HumanResources.Employee
where Title like @TitlePar' --應用參數化的top和like

--應用sp_executesql 來履行,可以進步效力
exec sp_executesql @SelectSql,
N'@TopCountPar as int,@TitlePar as nvarchar(100)',
@TopCountPar = @TopCount,@TitlePar = @Title

---+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 | A1   | B1   |    9 |
|  2 | A2   | B1   |    7 |
|  3 | A3   | B1   |    4 |
|  4 | A4   | B1   |    2 |
|  5 | A1   | B2   |    2 |
|  6 | A2   | B2   |    9 |
|  7 | A3   | B2   |    8 |
|  8 | A4   | B2   |    5 |
|  9 | A1   | B3   |    1 |
| 10 | A2   | B3   |    8 |
| 11 | A3   | B3   |    8 |
| 12 | A4   | B3   |    6 |
| 13 | A1   | B4   |    8 |
| 14 | A2   | B4   |    2 |
| 15 | A3   | B4   |    6 |
| 16 | A4   | B4   |    9 |
| 17 | A1   | B4   |    3 |
| 18 | A2   | B4   |    5 |
| 19 | A3   | B4   |    2 |
| 20 | A4   | B4   |    5 |
+----+------+------+------+
20 rows in set (0.00 sec)

mysql>

希冀成果

+------+-----+-----+-----+-----+------+
|C1    |B1   |B2   |B3   |B4   |Total |
+------+-----+-----+-----+-----+------+
|A1    |9    |2    |1    |11   |23    |
|A2    |7    |9    |8    |7    |31    |
|A3    |4    |8    |8    |8    |28    |
|A4    |2    |5    |6    |14   |27    |
|Total |22   |24   |23   |40   |109   |
+------+-----+-----+-----+-----+------+

1. 應用SUM(IF()) 生成列 + WITH ROLLUP 生成匯總行,並應用 IFNULL將匯總行題目顯示為 Total

mysql> SELECT
    ->     IFNULL(c1,'total') AS total,
    ->     SUM(IF(c2='B1',c3,0)) AS B1,
    ->     SUM(IF(c2='B2',c3,0)) AS B2,
    ->     SUM(IF(c2='B3',c3,0)) AS B3,
    ->     SUM(IF(c2='B4',c3,0)) AS B4,
    ->     SUM(IF(c2='total',c3,0)) AS total
    -> FROM (
    ->     SELECT c1,IFNULL(c2,'total') AS c2,SUM(c3) AS c3
    ->     FROM tx
    ->     GROUP BY c1,c2
    ->     WITH ROLLUP
    ->     HAVING c1 IS NOT NULL
    -> ) AS A
    -> GROUP BY c1
    -> WITH ROLLUP;
+-------+------+------+------+------+-------+
| total | B1   | B2   | B3   | B4   | total |
+-------+------+------+------+------+-------+
| A1    |    9 |    2 |    1 |   11 |    23 |
| A2    |    7 |    9 |    8 |    7 |    31 |
| A3    |    4 |    8 |    8 |    8 |    28 |
| A4    |    2 |    5 |    6 |   14 |    27 |
| total |   22 |   24 |   23 |   40 |   109 |
+-------+------+------+------+------+-------+
5 rows in set, 1 warning (0.00 sec)

2. 應用SUM(IF()) 生成列 + UNION 生成匯總行,並應用 IFNULL將匯總行題目顯示為 Total
mysql> select c1,
    -> sum(if(c2='B1',C3,0)) AS B1,
    -> sum(if(c2='B2',C3,0)) AS B2,
    -> sum(if(c2='B3',C3,0)) AS B3,
    -> sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL
    -> from tx
    -> group by C1
    -> UNION
    -> SELECT 'TOTAL',sum(if(c2='B1',C3,0)) AS B1,
    -> sum(if(c2='B2',C3,0)) AS B2,
    -> sum(if(c2='B3',C3,0)) AS B3,
    -> sum(if(c2='B4',C3,0)) AS B4,SUM(C3) FROM TX
    -> ;
+-------+------+------+------+------+-------+
| c1    | B1   | B2   | B3   | B4   | TOTAL |
+-------+------+------+------+------+-------+
| A1    |    9 |    2 |    1 |   11 |    23 |
| A2    |    7 |    9 |    8 |    7 |    31 |
| A3    |    4 |    8 |    8 |    8 |    28 |
| A4    |    2 |    5 |    6 |   14 |    27 |
| TOTAL |   22 |   24 |   23 |   40 |   109 |
+-------+------+------+------+------+-------+
5 rows in set (0.00 sec)

mysql>

3.  應用SUM(IF()) 生成列,直接生成成果不再應用子查詢
mysql> select ifnull(c1,'total'),
    -> sum(if(c2='B1',C3,0)) AS B1,
    -> sum(if(c2='B2',C3,0)) AS B2,
    -> sum(if(c2='B3',C3,0)) AS B3,
    -> sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL
    -> from tx
    -> group by C1 with rollup ;
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1   | B2   | B3   | B4   | TOTAL |
+--------------------+------+------+------+------+-------+
| A1                 |    9 |    2 |    1 |   11 |    23 |
| A2                 |    7 |    9 |    8 |    7 |    31 |
| A3                 |    4 |    8 |    8 |    8 |    28 |
| A4                 |    2 |    5 |    6 |   14 |    27 |
| total              |   22 |   24 |   23 |   40 |   109 |
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)

mysql>

4. 靜態,實用於列不肯定情形,
mysql> SET @EE='';
mysql> SELECT @EE:=CONCAT(@EE,'SUM(IF(C2=/'',C2,'/'',',C3,0)) AS ',C2,',') FROM (SELECT DISTINCT C2 FROM TX) A;

mysql> SET @QQ=CONCAT('SELECT ifnull(c1,/'total/'),',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(C3) AS TOTAL FROM TX GROUP BY C1 WITH ROLLUP');
Query OK, 0 rows affected (0.00 sec)

mysql> PREPARE stmt2 FROM @QQ;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE stmt2;
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1   | B2   | B3   | B4   | TOTAL |
+--------------------+------+------+------+------+-------+
| A1                 |    9 |    2 |    1 |   11 |    23 |
| A2                 |    7 |    9 |    8 |    7 |    31 |
| A3                 |    4 |    8 |    8 |    8 |    28 |
| A4                 |    2 |    5 |    6 |   14 |    27 |
| total              |   22 |   24 |   23 |   40 |   109 |
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>

以上均由網友  liangCK , wwwwb , WWWWA , dap570 供給, 再次感激他們的支撐。
其實數據庫中也能夠用 CASE WHEN / DECODE 取代 IF

� n,個中n 是一個八進制換碼值。八進制換碼值必需是 1, 2 或 3 個數字長。 
例如,"\11" 和 "\011" 都與一個制表符婚配。"\0011"等價於"\001" 與 "1"。八進制換碼值不得跨越 256。不然,只要前兩個字符被視為表達式的一部門。許可在正則表達式中應用ASCII碼。 
\xn:婚配n,個中n是一個十六進制的換碼值。十六進制換碼值必需正好為兩個數字長。例如,"\x41"婚配"A"。"\x041"等價於"\x04" 和 "1"。許可在正則表達式中應用 ASCII 碼。 
   好了,經常使用的辦法和屬性就是這些了,下面的語法引見的曾經很具體了,我們就沒有需要在羅嗦了,接上去我們來看看在詳細的例子外面若何應用這些辦法和屬性來校驗數據的正當性,我們照樣舉個例子吧,好比,我們想要對用戶輸出的電子郵件停止校驗,那末,甚麼樣的數據才算是一個正當的電子郵件呢?我可以如許輸出:[email protected],固然我也會如許輸出:[email protected],然則如許的輸出就長短法的:xxx@@com.cn或許@xxx.com.cn,等等,所以我們得出一個正當的電子郵件地址至多應該知足以下幾個前提: 
1. 必需包括一個而且只要一個符號“@” 
2. 必需包括至多一個至少三個符號“.” 
3. 第一個字符不得是“@”或許“.” 
4. 不許可湧現“@.”或許.@ 
5. 開頭不得是字符“@”或許“.” 
所以依據以上的准繩和下面表中的語法,我們很輕易的便可以獲得須要的模板以下:"(\w)+[@]{1}(\w)+[.]{1,3}(\w)+" 
  接上去我們細心剖析一下這個模板,起首“\w”表現郵件的開端字符只能是包括下劃線的單詞字符,如許,知足了第三個前提;“[@]{1}”表現在電子郵件中應該婚配而且只能婚配一次字符“@”,知足了前提一;異樣的“[.]{1,3}”表現在電子郵件中至多婚配1個至少婚配3個字符“.” ,知足了第二個前提;模板最初的“(\w)+”表現開頭的字符只能是包括下劃線在內的單詞字符,知足了前提五;模板中央的“(\w)+”知足了前提四。 
  然後,我們就直接挪用適才的誰人函數CheckExp("(\w)+[@]{1}(\w)+[.]{1}(\w)+",待校驗的字符串)就行了,假如前往True就表現數據是正當的,不然就是不准確的,怎樣樣,簡略吧。我們還可以寫出來校驗身份證號碼的模板:"([0-9]){15}";校驗URL的模板:"^http://{1}((\w)+[.]){1,3}"等等;我們可以看到,這些模板為我們供給了很好的可厚利用的模塊,應用本身或許他人供給的各類模板,我們便可以便利快捷的停止數據的正當性校驗了,信任你必定會寫出異常通用的模板的。 
  如許,我們只需定制分歧的模板,便可以完成對分歧數據的正當性校驗了。所以,正則表達式對象中最主要的屬性就是:“Pattern”屬性,只需真正控制了這個屬性,才可以自在的應用正則表達式對象來為我們的數據校驗停止辦事。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved