【meil】MS SQL用ROWCOUNT解決TOP子句不支援變數的問題

iDotNetSpace發表於2008-07-23

在使用SQL Server(SQL Server 2000)進行排序我們經常使用的是TOP關鍵字,但是使用TOP有一個問題,就是TOP後面只支援數值而不支援數值型的變數,這樣就沒有辦法在儲存過程中來支援這種動態排序的要求。或者使用Exec來執行構造SQL來執行,但這樣執行的效率低而且不夠靈活。

實際上,在SQL Server 2000中我們完全可以使用ROWCOUNT關鍵字解決這個問題。

ROWCOUNT關鍵字作用是可以直接指定需要返回記錄集的行數。

1、使用ROWCOUNT查詢前100行記錄。

DECLARE @rc INT

SET @rc = 100
SET ROWCOUNT @rc

SELECT * FROM emp

使用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章