在使用游标tsql处理之前对行进行计数

问题描述 投票:5回答:3

我有一个使用游标的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

sql-server tsql count cursor rows
3个回答
11
投票

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

Cursor Options (Static/ReadOnly/Dynamic)

@@Cursor_Rows


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
)
...

0
投票

这里是如何使用@@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

© www.soinside.com 2019 - 2024. All rights reserved.