While循环中的光标

时间:2010-01-24 06:56:32

标签: sql cursor

我的光标和输出

SET NOCOUNT ON
DECLARE @vendor_id int, @vendor_name nvarchar(50)
DECLARE @subvendor_id int, @subvendor_name nvarchar(50)   
PRINT '-------- Vendor Products Report --------'
DECLARE vend_cursor CURSOR FOR SELECT * FROM MYSEQ

OPEN vend_cursor
FETCH NEXT FROM vend_cursor 
INTO @vendor_id, @vendor_name

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT ' '
    -- Declare an inner cursor based   
    -- on vendor_id from the outer cursor.
    DECLARE product_cursor CURSOR FOR  SELECT * FROM MYSEQ

    OPEN product_cursor
    FETCH NEXT FROM product_cursor INTO @subvendor_id,@subvendor_name

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF(@subvendor_id >3)
            SELECT * FROM MYSEQ WHERE SQLID =@subvendor_id
            FETCH NEXT FROM product_cursor INTO @subvendor_id,@subvendor_name
    END

    CLOSE product_cursor
    DEALLOCATE product_cursor
    -- Get the next vendor.
    FETCH NEXT FROM vend_cursor INTO @vendor_id, @vendor_name
END 
CLOSE vend_cursor
DEALLOCATE vend_cursor

alt text http://www.freeimagehosting.net/uploads/10f5e2fe4e.png

问题

我在多行值中得到答案。我需要像行集合一样 像这样

4 text4
5 text5

(也不应包含重复记录)

编辑:这只是示例查询。我需要做很多条件。这就是我写这样的原因。

编辑光标

我需要在日期重叠记录......

RowId, CheckIn, CheckOut
1      10 AM    2 PM
2      10.30 AM  11.30 AM
3     8 AM     9 AM

我想只选择重叠记录以及多少重叠对... 这就是为什么我选择多光标

3 个答案:

答案 0 :(得分:2)

暂时忘记在SQL中使用游标......

在任何语言中,为什么要声明内部循环与外部循环具有相同的迭代?在这种情况下,两个游标都基于SELECT * FROM MYSEQ

答案 1 :(得分:1)

@@ FETCH_STATUS是一个可用于连接上所有游标的全局变量,因此当嵌套游标完成时,它会将全局变量设置为-1(表示行的结尾),外部循环也将终止。 见https://msdn.microsoft.com/en-GB/library/ms187308.aspx

答案 2 :(得分:0)

我发生了三件事。

我认为这是你正在进行的一些测试。但是您已经定义了两个游标来执行完全相同的查询。这就是为什么你可能会获得重复行的一个原因。当然,你的问题缺乏明确的商业逻辑,这使我们很难理解你想要实现的目标。

第二个是,你有一个嵌套循环,循环遍历另一个表的记录中的一个表的记录。但是你忽略了将内部光标选择的行与外部光标的当前行连接起来。因此,vend_cursor中的每一行都将获取product_cursor中完全相同的行集。

最后,product_cursor未按distinct关键字排序或过滤。鉴于前两点,这可能无关紧要。我只是为了完整起见而提到它。