6

我有一个使用游标的 SQL Server sp,因此:

DECLARE TestCursor CURSOR FOR
    SELECT
        tblHSOutcomes.strOutcomeName, 
        tblHSData.fkHSTest
    FROM
        tblHSData 
        INNER JOIN tblHSOutcomes ON tblHSData.fkOutcome = tblHSOutcomes.uidOutcome 
        INNER JOIN tblHSTests ON tblHSData.fkHSTest = tblHSTests.uidTest
    WHERE
        tblHSData.fkEpisode = @uidHSEpisodes

OPEN TestCursor
    FETCH NEXT FROM TestCursor
    INTO @Result, @TestID

WHILE @@FETCH_STATUS = 0
BEGIN
...etc

它工作正常,但是如果能够在继续处理游标查询之前检查游标查询是否有任何记录,那就太好了。如果有一个@@变量可以用来检查这个?

我知道有@@RowCount- 但这只有当前处理的行数 - 所以不是很有帮助

理想情况下,我希望能够做这样的事情:

if @@cursorQueryHasRecords 
BEGIN
WHILE @@FETCH_STATUS = 0
BEGIN
...etc

谢谢

4

3 回答 3

12

如果您能够将光标声明为,STATIC那么您可以使用内置函数@@Cursor_Rows

光标选项(静态/只读/动态)

@@Cursor_Rows

于 2010-09-17T11:11:05.450 回答
4
if exists(
    SELECT
        tblHSOutcomes.strOutcomeName, 
        tblHSData.fkHSTest
    FROM
        tblHSData 
        INNER JOIN tblHSOutcomes ON tblHSData.fkOutcome = tblHSOutcomes.uidOutcome 
        INNER JOIN tblHSTests ON tblHSData.fkHSTest = tblHSTests.uidTest
    WHERE
        tblHSData.fkEpisode = @uidHSEpisodes
)
...
于 2010-09-17T10:52:42.963 回答
3

这是一个如何使用的例子@@Cursor_Rows

DECLARE TestCursor CURSOR STATIC FOR
  SELECT <snip>

OPEN TestCursor

IF @@Cursor_Rows > 0 BEGIN

  FETCH NEXT FROM TestCursor INTO @compid, @logid, @category
  WHILE @@FETCH_STATUS = 0 BEGIN   

  <snip>
END

CLOSE TestCursor
DEALLOCATE TestCursor

请注意,您需要声明游标STATIC(或KEYSET

于 2019-12-20T16:16:50.943 回答