优化SQL游标

时间:2016-02-09 14:25:13

标签: sql sql-server

我是SQL的新手,被问到是否可以改进一些事情。我能够清理一些东西,但这个让我陷入困境。这些运行超级慢,但我不知道如何解决它。也许嵌套选择?

从几个源中提取数据并将其推送到临时表中,然后将其用于报告...但是游标是如何执行大量更新来清理数据的。他们找到具有空值的记录,然后查找具有填充的cs_no的类似记录以更新空值。

非常感谢任何帮助,谢谢

Declare CSUPDATE Cursor For 
    Select  Distinct cs_no
    From   #TEMP_EH 
    ORDER BY CS_NO
Open CSUPDATE
Fetch Next From CSUPDATE into @CS
While @@FETCH_STATUS = 0
    BEGIN
        Declare CS Cursor for
            SELECT  seqno
            FROM    #TEMP_EH
            WHERE   comment like '%'+@CS+'%' and 
                (cs_no is Null or cs_no = 'No Match Found')
                and comment is not null
            open cs
            fetch next from cs into @seq
            while @@FETCH_STATUS = 0
                begin
                    UPDATE      #TEMP_EH
                        Set   CS_NO = @CS
                        where seqno = @seq
                    fetch next from cs into @seq
                end
            close cs
            deallocate cs
        Fetch Next From CSUPDATE into @CS
    END
Close CSUPDATE
Deallocate CSUPDATE    

编辑: 感谢您的建议,下次我的问题一定会更详细。

我的会议开始创建测试表后,通过反复试验找到了解决方案。

    create table #derp(cs_no varchar(20), comment varchar(20))
    insert into #derp values (NULL, 'stuff')
    insert into #derp values (NULL, 'bacon2')
    insert into #derp values ('stuff', 'bacon3')

    select * from #derp

    UPDATE  a
    SET     a.cs_no = b.cs_no
    FROM #derp  A
    INNER JOIN #derp B on a.comment LIKE '%'+b.cs_no+'%'
    WHERE (a.cs_no is Null
            OR  a.cs_no = 'No Match Found')
            AND a.comment is not null

    select * from #derp
    --drop table #derp

2 个答案:

答案 0 :(得分:0)

目标是通过搜索评论中包含cs_no的其他记录来更新cs_no字段。它的粗略,但它的报告链接数据不完整/损坏和链接字段的项目给用户一个很好的猜测跟踪我们的神秘项目是。我的部分问题是不知道意图,但在这里你去......

在示例表中,第一条记录包含(NULL,'stuff')。然后将评论('stuff')链接到第三条记录,其中cs_no为'stuff'。然后,更新将第一条记录填充到('stuff','stuff')

    create table #derp(cs_no varchar(50), comment varchar(50))
    insert into #derp values (NULL, 'stuff')
    insert into #derp values (NULL, 'bacon2')
    insert into #derp values ('stuff', 'bacon3')

    select * from #derp

    UPDATE  a
    SET     a.cs_no = b.cs_no
    FROM #derp  A
    INNER JOIN #derp B on a.comment LIKE '%'+b.cs_no+'%'
    WHERE (a.cs_no is Null
            OR  a.cs_no = 'No Match Found')
            AND a.comment is not null
            AND a.comment <> ''

    select * from #derp
    --drop table #derp

答案 1 :(得分:-1)

不要使用游标!如果您可以将其重新编写为设置操作,那么速度会快得多。使用游标会导致任何大型数据集的性能下降。