подсчет строк перед обработкой курсором tsql - PullRequest
5 голосов
/ 17 сентября 2010

У меня есть 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

Он работает нормально, однако было бы неплохо иметь возможность проверить, есть ли в запросе курсоров какие-либо записи, прежде чем продолжить обработку через него,если есть @@ var, который я могу использовать, чтобы проверить это?Я знаю, что есть @@ RowCount - но здесь обрабатывается только текущее количество строк - поэтому это не очень полезно

в идеале я хотел бы иметь возможность сделать что-то вроде этого:

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

спасибо

nat

Ответы [ 2 ]

11 голосов
/ 17 сентября 2010

Если вы можете объявить курсор как STATIC, вы можете использовать встроенную функцию @@Cursor_Rows

Параметры курсора (статический / только для чтения / динамический)

@@ Cursor_Rows

4 голосов
/ 17 сентября 2010
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
)
...
...