2016-05-17 73 views
1

我在要求对这两件事情有高度的理解。SQL Server:表vs光标

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

我真的不明白的是,为什么这两样东西谈论像两个独立的动物。对我来说,游标似乎是表格的一个子集。这本书我读隐约提到

“一些语言元素和操作在SQL期待与查询,而不是使用游标 表结果工作;例子包括表 表达式和集合运算符”

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

只是为了澄清,我会从书上打出来的段落:

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

+0

请准确报价 – lad2025

+0

@JamesZ,他确定。 SQL从一侧建立在集合论上,另一侧建立在谓词逻辑上。 –

+0

是的 - 但我很早就开始讨论这个概念。这本书是T-Sql Fundamentals,第2章,第43页。我想也许我只是误解了作者正在尝试沟通的内容。 – Farellia

回答

0

对于这句话,

”一些语言元素和操作在SQL期待与查询 表的结果,而不是使用游标工作;例子包括表 表达式和集合运算符”

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

例如,我想不出任何一点将ORDER BY放在CTE(“表表达式”)或子查询中IN()表达式除非(在两种情况下)a TOP n是我们编辑也是如此。

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

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 

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

请让我知道,如果这并不能为您澄清。