文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 国产软件 | 国外软件 | 汉化补丁 | 设为首页 | 加入收藏
业界资讯 | 图形图像 | 操作系统 | 网络冲浪 | 工具软件 | 办公软件 | 媒体动画 | 精文荟萃 | 认证考试 | 网站建设 | 技术开发 | 专栏
当前位置:abcdown网络学院网络编程MSSQLMS SQL用ROWCOUNT解决TOP子句不支持变量的问题
精品广告
推荐TOP10
·SQL Server连接失败错误故障的分析与排除
·SQL server 2005安装问题汇总
·Sql server优化50法
·SQL Server 2005 中的分区表和索引
·SQL Server不存在或访问被拒绝 问题的解决
·在SQL Server 2000里设置和使用数据库复制
·sql 经典语句
·SQL Server企业管理器和查询分析器简介
·常用SQL语句词典
·结束SQL注入隐患3招
阅读TOP10
·sql server日期时间函数
·SQL Server安装文件挂起错误解决办法
·SQL Server不存在或访问被拒绝 问题的解决
·在SQL Server 2000里设置和使用数据库复制
·用SQL一次插入多条数据
·在sqlserver2005中安装sql server 2000的示例数据库northwind
·SQL Server 2005 Express Edition安装步骤详解
·将文本文件导入Sql server数据库
·SQL Server 2005 中的分区表和索引
·sql 经典语句

MS SQL用ROWCOUNT解决TOP子句不支持变量的问题

日期:2006年12月17日 作者: 查看:[大字体 中字体 小字体]


因为仰望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



上一篇:asp连接数据库的方法(全)

下一篇:用SQL语句实现异构数据库之间的导数据导入/出


相关软件: 相关文章:
·视频聊天变了“味” 向“裸聊” 色情宣战
·标题栏字体变小的原因以及根治方法
·WEB打印设置解决方案二(利用ScriptX.cab控件改变IE打印设置)
·在电脑上演奏!把PC变成高档电子琴
·Photoshop让美女的皮肤变得更白
·《信长野望12革新》本能寺之变剧情
·让Windows XP开始菜单变模样

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.abcdown.net
首页 | 本站声明 | 下载帮助 | 发布软件 |
中文版权所有:ABC学院 浙ICP备05000717号