游标类型产生的数据检索问题

原创 2007年05月12日 12:30:00

表现:

将数据库兼容级别从80 改到90 , 下面的游标循环不出数据, 但单独SELECT 有结果

DECLARE MyCursor CURSOR LOCAL READ_ONLY

FOR 

SELECT

    Col1

FROM tbname WITH(NOLOCK)

WHERE Name LIKE 'SNET%'

    AND B_Key IN(

            SELECT TOP(100)

                KeyID

            FROM tbmaster WITH(NOLOCK)

            WHERE Date >= '01/01/2007'

                AND Date < '02/01/2007')

OPEN MyCursor

FETCH NEXT FROM MYCURSOR

WHILE (@@FETCH_STATUS=0)

BEGIN

    FETCH NEXT FROM MYCURSOR

END

CLOSE MyCursor

DEALLOCATE MyCursor

 

分析:

导致出现这个情况的原因是游标类型的问题.

按照上述定义, 游标类型是: DYNAMIC

定义这种游标的情况下, S 锁是必须下的, NOLOCK 提示不会起作用, 这个通过查询游标OPEN 时的sp_lock  信息可以观察得到. 它产生了IS S

NOLOCK 提示是否起作用, 会影响的执行的结果(执行计划一样, 但在取数据的时候, 会有所差异)

对于下面这句, NOLOCK 和无NOLOCK , 它取的数据是不一样的, 因为它只取了TOP 100, 而且没有ORDER BY 来保证取数的顺序, 所以取数据顺序的细致差异, 就导致了最终结果的不同. 而最终结果的不同, 导致了整个游标取出来的数据不同.

SELECT TOP(100)

    KeyID

FROM tbmaster WITH(NOLOCK)

WHERE Date >= '01/01/2007'

    AND Date < '02/01/2007')

 

在游标定义SELECT 语句中, NOLOCK 有效时, 是可以取到数据的, NOLOCK 无效(DYNAMIC 游标导致), 查询结果是无数据的

所以最终看到的结果是: 游标循环不出来数据, 但只做查询却有数据.

如果把游标定义中的查询语句的NOLOCK 去掉做查询, 也会没有数据(DYNAMIC 游标结果一致)

 

故这个问题严格来说不应该是兼容级别的问题, 80 级别下, 还是有可能发生, 只是机率更小, 或者是内部执行原理不太一样, 导致没有这种情况出来而已

因为没有ORDER BY 保证顺序, 而有无NOLOCK 的数据可能不会一样, 所以理论上80 90 下都可能出现问题, 只是90 比较突出, 或者正好被发现了而已

 

 

解决的办法:

把游标定义改成下面的, 这样不会导致NOLOCK 失效, 而且速度比原来的定义方式快得多. 如果游标一定要与原始表的数据变化关联起来, 建议用KEYSET, 或者是去掉NOLOCK 提示(因为没有意义), 如果对取的数据是有要求的, 则还应该考虑加ORDER BY 保证取数顺序

DECLARE MyCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC

FOR

 

相关文章推荐

将数据库中的数据转换为insert语句

CREATE PROCEDURE sp_generate_insert_script @table_list varchar(8000)=*--Format of @table_list: --tb ...
  • pbsql
  • pbsql
  • 2006年02月21日 20:18
  • 1775

maven pom文件详解

1 project xmlns="http://maven.apache.org/POM/4.0.0 "        2     3     xmlns:xsi="http://www.w3.o...

2.数据检索|模糊查询|数据排序|数据分组| 常见问题0726

难点====分组查询group by...having         在分组查询中,查询的列名         必须出现在group by后或者在聚合函数中         --查询平均工资大...

数据检索幻灯片学习

  • 2015年06月10日 15:57
  • 2.36MB
  • 下载

大存储数据检索删除工具

  • 2015年09月30日 11:33
  • 233KB
  • 下载

云存储加密数据检索面临挑战

云存储加密数据检索面临挑战 分类: 文章2013-01-17 09:27 210人阅读 评论(0) 收藏 举报 云存储加密数据检索面临挑战 2011-02-14 02:45出处:...

APEX的IR下大量数据检索的提速方法---兼谈动态SQL在IR的实现

系统中有一个表积累了10多年的数据,记录有上百万条,系统的所有部门还不让将旧数据Archive出去。原因是有时候要检索旧数据(1回/月的频度)。 但是,日常检索集中在今年及去年的数据,结果返回要花1...

MySQL数据检索+查询+全文本搜索

【0】README 0.1)本文部分文字描述转自“MySQL 必知必会”,旨在review“MySQL数据检索+查询+全文本搜索” 的基础知识; 【1】使用子查询 1)查询定义:任何...

实验六 数据检索

实验六 数据检索   1、实验目的 (1)掌握SELECT各子句的功能和检索数据的方法 (2)掌握WHERE子句中LINK、IN、BETEEN、IS等逻辑运算符的使用 (3)掌握COMOUT...
  • oZuoQi
  • oZuoQi
  • 2014年12月26日 02:39
  • 609

数据检索---分词算法

在Lucene索引的时候已经引出了分词(Analyser)这个慨念,分词也是信息检索的时候重要的一步。我们知道英文一个单词就是一个词,两者直接使用空格天然的隔开,分词就变得很容易了,而汉语的一个句子里...
  • hugolyl
  • hugolyl
  • 2015年10月20日 12:17
  • 564
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:游标类型产生的数据检索问题
举报原因:
原因补充:

(最多只允许输入30个字)