SQL Prompt使用教程:避免使用舊式TOP子句(ST006)
SQL Prompt是一款實(shí)用的SQL語(yǔ)法提示工具。SQL Prompt根據(jù)數(shù)據(jù)庫(kù)的對(duì)象名稱、語(yǔ)法和代碼片段自動(dòng)進(jìn)行檢索,為用戶提供合適的代碼選擇。自動(dòng)腳本設(shè)置使代碼簡(jiǎn)單易讀--當(dāng)開(kāi)發(fā)者不大熟悉腳本時(shí)尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據(jù)需要進(jìn)行自定義,使之以預(yù)想的方式工作。
該TOP子句的語(yǔ)法堅(jiān)持將括號(hào)或括起來(lái)的表達(dá)式作為其第一個(gè)參數(shù),因此TOP 34嚴(yán)格來(lái)說(shuō)應(yīng)該是TOP (34),盡管如果您僅提供數(shù)字常量(例如)作為34參數(shù),則任何一種樣式都可以使用。的早期版本TOP只能使用一個(gè)恒定值,因此不需要括號(hào),并且仍然支持舊的無(wú)括號(hào)樣式,因此使用SQL Server 早期版本編寫(xiě)的代碼仍然可以使用。
但是,TOP從那時(shí)起已經(jīng)走了很長(zhǎng)一段路,現(xiàn)在支持使用表達(dá)式,例如(@Rows*2)或子查詢。在這種情況下,必須使用方括號(hào)。當(dāng)他們還需要TOP在使用INSERT,UPDATE,MERGE,和DELETE語(yǔ)句,所以它是一種習(xí)慣值得采取無(wú)處不在。當(dāng)SQL Prompt 發(fā)現(xiàn)使用舊式語(yǔ)法時(shí),將引發(fā)其“違反代碼風(fēng)格”警告之一(ST006)。
TOP例子
想象一下,我們希望獲得AdventureWorks表現(xiàn)最佳的前十名客戶。
SELECT TOP 10 WITH TIES Sum(Ord.SubTotal) AS spend,
Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' '
+ Coalesce(Per.MiddleName + ' ', '') + Per.LastName
+ Coalesce(Per.Suffix, '')
)
FROM Sales.SalesOrderHeader AS Ord
INNER JOIN Sales.Customer AS Cust
ON Ord.CustomerID = Cust.CustomerID
INNER JOIN Person.Person AS Per
ON Cust.PersonID = Per.BusinessEntityID
GROUP BY Ord.CustomerID
ORDER BY spend DESC;
清單1:前十名并列領(lǐng)帶
TOP 10 WITH TIES即使嚴(yán)格地我們應(yīng)該使用,這種舊式語(yǔ)法也將很愉快地運(yùn)行(10)。
SELECT TOP (SELECT Count(*)/1000 FROM Sales.Customer) Sum(Ord.SubTotal) AS spend, Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' ' + Coalesce(Per.MiddleName + ' ', '') + Per.LastName + Coalesce(Per.Suffix, '') ) FROM Sales.SalesOrderHeader AS Ord INNER JOIN Sales.Customer AS Cust ON Ord.CustomerID = Cust.CustomerID INNER JOIN Person.Person AS Per ON Cust.PersonID = Per.BusinessEntityID GROUP BY Ord.CustomerID ORDER BY spend DESC
清單2:TOP 0.1%的客戶
使用OFFSET和FETCH NEXT作為替代
如果您不喜歡在做括號(hào)時(shí)感到煩惱,則可以高高興興地使用它OFFSET,F(xiàn)ETCH NEXT而不是不需要括號(hào),盡管花了很多時(shí)間。
SELECT Sum(Ord.SubTotal) AS spend,
Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' '
+ Coalesce(Per.MiddleName + ' ', '') + Per.LastName
+ Coalesce(Per.Suffix, '')
)
FROM Sales.SalesOrderHeader AS Ord
INNER JOIN Sales.Customer AS Cust
ON Ord.CustomerID = Cust.CustomerID
INNER JOIN Person.Person AS Per
ON Cust.PersonID = Per.BusinessEntityID
GROUP BY Ord.CustomerID
ORDER BY spend DESC
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;
清單3:使用OFFESET和FETCH NEXT
你不能做的聯(lián)系,但你可以指定一個(gè)變量,參數(shù),甚至中常子查詢作為參數(shù)傳遞給OFFSET和FETCH NEXT,除非你使用子查詢你不需要支架。
SELECT Sum(Ord.SubTotal) AS spend,
Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' '
+ Coalesce(Per.MiddleName + ' ', '') + Per.LastName
+ Coalesce(Per.Suffix, '')
)
FROM Sales.SalesOrderHeader AS Ord
INNER JOIN Sales.Customer AS Cust
ON Ord.CustomerID = Cust.CustomerID
INNER JOIN Person.Person AS Per
ON Cust.PersonID = Per.BusinessEntityID
GROUP BY Ord.CustomerID
ORDER BY spend DESC
OFFSET 0 ROWS
FETCH NEXT (SELECT Count(*)/1000 FROM Sales.Customer) ROWS ONLY;
清單4:將FETCH NEXT與子查詢一起使用
結(jié)論
SQL中有更嚴(yán)重的缺點(diǎn),就是在TOP語(yǔ)句的參數(shù)中省略了方括號(hào)。奇怪的是,我一直對(duì)離開(kāi)它們感到有點(diǎn)不自在,因?yàn)樽屛覀兿肫甬?dāng)今TOP子句的功能非常有用。與過(guò)去不得不暫時(shí)將ROWCOUNT設(shè)置為要返回的行數(shù)相距很遠(yuǎn)!