【问题标题】:counting rows before processing with a cursor tsql在使用游标 sql 处理之前计算行数
【发布时间】:2010-09-17 10:51:21
【问题描述】:

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

谢谢

【问题讨论】:

标签: sql-server tsql count rows database-cursor


【解决方案1】:

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

Cursor Options (Static/ReadOnly/Dynamic)

@@Cursor_Rows

【讨论】:

  • 我相信您也可以将@@CURSOR_ROWS 与KEYSET 游标一起使用。
【解决方案2】:
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
)
...

【讨论】:

  • 您好,感谢您的回复。我如何将它包装在光标位中..不想运行该查询两次..大概我不能为 if exists(select ....
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2010-11-12
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多