国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

MS SQL用ROWCOUNT解決TOP子句不支持變量的問題

2024-07-21 02:31:51
字體:
來源:轉載
供稿:網友

因為仰望Oracle,所以一直都以為SQL SERVER很笨。

據傳SQL 2005有了RowID的東西,可以解決TOP排序的問題。可惜還沒有機會體驗。在SQL 2000中寫存儲過程,總會遇到需要TOP的地方,而一旦遇到TOP,因為沒辦法把TOP后面的數字作為變量寫到預編譯的語句中去,所以只能夠使用構造SQL,使用Exec來執行。不說效率的問題,心里也總覺得這個辦法很笨。

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

ROWCOUNT關鍵字的用法在聯機幫助中有比較詳細的說明,這兒就不羅嗦了。談談體會。

1、使用ROWCOUNT查詢前幾行結果。

DECLARE @n INT
SET @n = 1000
SET ROWCOUNT @n
SELECT * FROM Table_1
 

 這樣,查詢結果將等同于

SELECT TOP 100 FROM Table_1

2、同樣的道理,使用INSERT INTO..SELECT的時候也有效。

DECLARE @n INT
SET @n = 1000
SET ROWCOUNT @n
INSERT INTO Table_2 (colname1)
SELECT colname1=colname2 FROM Table_1

執行的結果將等同于

INSERT INTO Table_2(colname1)
SELECT TOP 1000 colname1 = colname2 FROM Table_1

3、執行UPDATE和DELETE。

因為UPDATE和DELETE無法直接使用ORDER BY語法,如果使用ROWCOUNT,將按照主鍵順序從前往后操作。

DECLARE @n INT
SET @n = 1000
SET ROWCOUNT @n
DELETE FROM Table_1

不過也有解決辦法,只要能夠使用ORDER BY關鍵字就可以了,比如說直接用含ORDER BY的子句,或者先使用ORDER BY語法把需要操作的標識列存為一個臨時表或表變量,然后再操作語句中使用IN或EXISTS關鍵字。

DECLARE @n INT
SET @n = 1000
SET ROWCOUNT @n
DECLARE @t TABLE(ID INT)
INSERT INTO @t
SELECT ID FROM Table_1 ORDER BY colname [ASC/DESC]

DELETE FROM  Table_1 WHERE ID IN (SELECT ID FROM @t)

4、對于ROWCOUNT的設置是與session有關的。如果占用了一個Session,那么對應的這個數據庫Session將使用最近一次設置的ROWCOUNT,直到Session結束或者修改了ROWCOUNT。

5、在用戶自定義函數中不能使用ROWCOUNT。

6、取消ROWCOUNT。

我不知道為什么在聯機幫助中說,寫存儲過程的時候應該注意盡量避免使用ROWCOUNT,而建議使用TOP。難道MS不知道TOP關鍵后面的數字不能為變量嗎?也許MS是出于擔心開發者忘記了取消ROWCOUNT而影響正常的實現。

使用這樣的語句即可取消ROWCOUNT了。

SET ROWCOUNT 0

8、總結

使用ROWCOUNT之后可以很方便的解決TOP關鍵字不能帶變量的問題,這樣,對于需要排序取值的問題就比較容易解決了。避免了使用EXEC來執行構造SQL語句,調試存儲過程的時候也要方便很多。唯一不方便的是,沒有找到獲取當前ROWCOUNT值的辦法,但仔細想來,得到這個值的用處也并不大。

http://www.cnblogs.com/David-weihw/archive/2006/11/08/554106.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 同德县| 庆元县| 玉田县| 龙陵县| 灵寿县| 麦盖提县| 滕州市| 扎赉特旗| 仙居县| 黄冈市| 琼中| 吕梁市| 平和县| 夏津县| 珠海市| 四川省| 宜州市| 布尔津县| 惠东县| 江北区| 威海市| 江源县| 芷江| 赤水市| 于都县| 军事| 华安县| 县级市| 宁夏| 玛曲县| 将乐县| 会宁县| 五大连池市| 达州市| 五家渠市| 龙门县| 张家口市| 昌吉市| 黄大仙区| 龙山县| 镇巴县|