带有OR语句的SQL游标

时间:2014-07-29 17:24:18

标签: sql cursors

我已经为某个人接管了一个项目,此时我们正试图让应用程序变得可用,并且不担心最好的方法。也就是说,我无法弄清楚Cursor似乎存在问题。我的游标中的select语句返回6行...

DECLARE testCursor cursor for 

select r.fldcode, r.rescode, r.[class], f.[print], r.[r print], f.[requestor], r.[r requestor]
    from field f INNER JOIN resv r 
    ON f.fldcode=r.fldcode
    where f.requestor = 'Admin Resdas' OR r.[r requestor] = 'Admin Resdas'

Open testCursor
Fetch Next from testCursor;

While @@FETCH_STATUS = 0
    BEGIN   
        PRINT 'IN HERE'
        Fetch Next FROM testCursor
    END

close testCursor
Deallocate testCursor

如果我在SQL Management studio中运行它,它只是继续运行但如果我将'OR'更改为'AND',则光标运行正常。我错过了什么使它无法使用'OR'语句正确运行?有时候不会填充两个列,这就是为什么我需要'OR'来工作它只是没有意义,因为语句本身就可以正常执行。

提前感谢您的帮助......

1 个答案:

答案 0 :(得分:0)

f.requestor和/或r.requestor上可能有一个索引可用于评估查询'和'条件但不是'或'条件。 (不确定SQL Server优化器的智能程度如何)

您可以尝试单独运行两个查询的并集 - 这应该返回相同的结果,有时在优化程序混淆时会有所帮助。

select r.fldcode, r.rescode, r.[class], f.[print], r.[r print], f.[requestor], r.[r requestor]
    from field f INNER JOIN resv r 
    ON f.fldcode=r.fldcode
    where f.requestor = 'Admin Resdas'
union
select r.fldcode, r.rescode, r.[class], f.[print], r.[r print], f.[requestor], r.[r requestor]
    from field f INNER JOIN resv r 
    ON f.fldcode=r.fldcode
    where r.[requestor] = 'Admin Resdas'