zoukankan      html  css  js  c++  java
  • MS SQL用ROWCOUNT解决TOP子句不支持变量的问题

    据传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值的办法,但仔细想来,得到这个值的用处也并不大。

  • 相关阅读:
    PointToPointNetDevice doesn't support TapBridgeHelper
    NS3系列—10———NS3 NodeContainer
    NS3系列—9———NS3 IP首部校验和
    NS3系列—8———NS3编译运行
    【习题 7-6 UVA
    【Good Bye 2017 C】 New Year and Curling
    【Good Bye 2017 B】 New Year and Buggy Bot
    【Good Bye 2017 A】New Year and Counting Cards
    【Educational Codeforces Round 35 D】Inversion Counting
    【Educational Codeforces Round 35 C】Two Cakes
  • 原文地址:https://www.cnblogs.com/qingshan/p/1516131.html
Copyright © 2011-2022 走看看