SQL Server:Tables vs Cursors

时间:2016-05-17 15:27:30

标签: sql-server

我要求高度了解这两件事情。

从我所读过的内容来看,似乎一般来说,带有ORDER BY子句的查询会返回一个游标,基本上游标对它们有顺序,而表格实际上是一个不保证顺序的集合

我真正理解的是,为什么这两件事情就像两个独立的动物一样被谈论。对我来说,游标似乎是表的一个子集。我读过的那本书含糊地提到了

  

" SQL中的某些语言元素和操作可以使用   表的查询结果而不是游标;例子包括表格   表达式和设置运算符"

我的问题是......为什么不呢?即使给出了有序集,为什么SQL不会像表那样处理它呢?

为了澄清,我将在书中输入段落:

  

带有ORDER BY子句的查询会导致标准SQL调用游标 - 非关系结果,行之间保证顺序。您可能想知道为什么查询返回表结果或游标很重要。 SQL中的一些语言元素和操作期望使用查询的表结果而不是游标;示例包括表表达式和集合运算符......"

2 个答案:

答案 0 :(得分:1)

表是结果集。它有列和行。您可以与其他表一起使用它来在一个操作中过滤或组合数据:

SELECT *
FROM TABLE1 T1
JOIN TABLE2 T2
    ON T1.PK = T2.PK

游标是存储结果集的变量。它有列,但行无法访问 - 除了顶部的行!您不能直接访问记录,而是必须一次获取它们。

DECLARE TESTCURSOR CURSOR
   FOR SELECT * FROM Table1

OPEN TESTCURSOR 
FETCH NEXT FROM TESTCURSOR 

如果需要,您还可以将它们提取到变量中,以进行更高级的处理。

如果不能为您澄清,请告诉我。

答案 1 :(得分:0)

关于这句话,

  

“SQL中的某些语言元素和操作可以使用   表的查询结果而不是游标;例子包括表格   表达式和设置运算符“

我认为作者只是说有些情况下在查询片段中使用/没有意义,因为ORDER BY应该在外部查询上,它实际上会影响查询的最终结果。

例如,我想不出在ORDER BY(“表格表达式”)或ORDER BY表达式中的子查询上放置CTE的任何意义。 除非(在这两种情况下)都使用IN( )

创建TOP n时,除非同时使用VIEW,否则SQL Server实际上不允许您使用ORDER BY。否则,从TOP n选择时,应指定ORDER BY,而不是VIEW本身的代码。