【meil】MS SQL用ROWCOUNT解決TOP子句不支援變數的問題
在使用SQL Server(SQL Server 2000)進行排序我們經常使用的是TOP關鍵字,但是使用TOP有一個問題,就是TOP後面只支援數值而不支援數值型的變數,這樣就沒有辦法在儲存過程中來支援這種動態排序的要求。或者使用Exec來執行構造SQL來執行,但這樣執行的效率低而且不夠靈活。
實際上,在SQL Server 2000中我們完全可以使用ROWCOUNT關鍵字解決這個問題。
ROWCOUNT關鍵字作用是可以直接指定需要返回記錄集的行數。
1、使用ROWCOUNT查詢前100行記錄。
DECLARE @rc INT |
使用TOP可以得到同樣的結果
SELECT TOP 100 FROM emp |
2、在INSERT INTO..SELECT中使用ROWROUNT。
DECLARE @rc INT SET @rc = 100 SET ROWCOUNT @rc INSERT INTO cust (cname) SELECT cname=emp_name FROM emp |
3、在執行UPDATE和DELETE時使用ROWCOUNT。
因為UPDATE和DELETE無法直接使用ORDER BY語法,如果使用ROWCOUNT,將按照主鍵順序從前往後操作。
DECLARE @rc INT SET @rc = 100 SET ROWCOUNT @rc DELETE FROM emp |
不過也有解決辦法,只要能夠使用ORDER BY關鍵字就可以了,比如說直接用含ORDER BY的子句,或者先使用ORDER BY語法把需要操作的標識列存為一個臨時表或表變數,然後再操作語句中使用IN或EXISTS關鍵字。
DECLARE @rc INT SET @rc = 100 SET ROWCOUNT @rc DECLARE @tmp TABLE(ID INT) INSERT INTO @tmp SELECT ID FROM emp ORDER BY cid[ASC/DESC] DELETE FROM emp WHERE ID IN (SELECT ID FROM @tmp ) |
4、對於ROWCOUNT的設定是與Session有關的。如果佔用了一個Session,那麼對應的這個資料庫Session將使用最近一次設定的ROWCOUNT,直到Session結束或者修改了ROWCOUNT。
5、在使用者自定義函式中不能使用ROWCOUNT。
6、取消ROWCOUNT設定。
使用這樣的語句即可取消ROWCOUNT了,因為如果不取消之後所以的查詢返回的結果集行數都會受此影響。
SET ROWCOUNT 0 |
我不知道為什麼在聯機幫助中說,寫儲存過程的時候應該注意儘量避免使用ROWCOUNT,而建議使用TOP。難道MS不知道TOP關鍵後面的數字不能為變數嗎?也許MS是出於擔心開發者忘記了取消ROWCOUNT而影響正常的實現。
8、總結
有了ROWCOUNT關鍵字後就可以非常方便的實現變數形式的排序問題了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-407096/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL 語句select top 變數問題SQL變數
- 【解決DML 語句包含不帶 INTO 子句的 OUTPUT 子句】
- 建立聯合函式索引解決top sql效能問題函式索引SQL
- 用SQL解決有向圖問題SQL
- 用Oracle表函式解決繫結變數集合問題Oracle函式變數
- TOP 子句
- WPF 解決 CommandParameter 引數不更新問題
- 用SQL解決有向圖問題(轉)SQL
- ORACLE通過BIND_AWARE+SQL PATCH解決SQL繫結變數中資料傾斜的問題OracleSQL變數
- Oracle中的sql%rowcountOracleSQL
- DMSQL TOP子句SQL
- SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNTSQL
- 【meil 】SQLServer Transact SQL全集(轉)SQLServer
- sql多參問題解決SQL
- SQL Server中@@ROWCOUNT的用法SQLServer
- sql%notfound、sql%rowcount和returnSQL
- docker下mysql連線數修改後不生效問題的解決DockerMySql
- Java技巧-解決JAVA_HOME變數無效問題Java變數
- 回收站不工作的問題解決
- 用PriorityQueue解決選擇最小的K個數問題
- SQL%ROWCOUNT的簡要說明SQL
- MS SQL Server datetime 用 PHP 取不出秒數?SQLServerPHP
- 解決mybatis用Map返回的欄位全變大寫的問題MyBatis
- 用Python解決一個等差數列的求和問題Python
- 光碟機不讀盤問題解決
- Maven解決repository不更換的問題Maven
- 宣告變數的問題變數
- 用SQL解決兩道有趣的題(二)SQL
- 用SQL解決兩道有趣的題(一)SQL
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 用簡單的方法解決問題
- 解決SSH遠端執行命令找不到環境變數的問題變數
- oracle中的sql%rowcount(R2)OracleSQL
- java解決數字黑洞問題Java
- 解決「問題」,不要解決問題
- 解決text-overflow: ellipsis;不生效的問題
- 解決cef中title不現實tooltip的問題
- 解決公網IP地址不夠的問題(轉)