名称为 'MY_CURSOR' 的游标已存在

A cursor with the name 'MY_CURSOR' already exists

我尝试通过游标获取数据,例如下面的代码,但出现错误:

A cursor with the name 'MY_CURSOR' already exists.

我搜索并发现我应该在游标的定义中使用 LOCAL 单词,例如 DECLARE MY_CURSOR LOCAL CURSOR 但再次出现错误

Invalid usage of the option local in the DECLARE CURSOR statement.

我该如何解决这个问题?

DECLARE @tag AS NVARCHAR(1000)
DECLARE @tempTbl AS TABLE (tagcol NVARCHAR(1000))
DECLARE MY_CURSOR LOCAL CURSOR 
FOR
    SELECT bt.Tag
    FROM   BlogTable AS bt
    WHERE  bt.IsEnglish = 0
           AND bt.IsActive = 1
           AND bt.IsDelete = 0

OPEN MY_CURSOR   
FETCH NEXT FROM MY_CURSOR INTO @tag
WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT INTO @tempTbl
    SELECT *
    FROM   dbo.FunSpliteStr(@tag, '،') 

    FETCH NEXT FROM MY_CURSOR INTO @tag
END

CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR

SELECT tagcol
FROM   @tempTbl AS tt
GROUP BY
       tt.tagcol

非游标查询

SELECT *
FROM   BlogTable AS bt
       CROSS APPLY dbo.FunSpliteStr(bt.Tag, '،') 
WHERE  bt.IsEnglish = 0
       AND bt.IsActive = 1
       AND bt.IsDelete = 0

我同意Larnu 上面的评论。我会删除上面的光标并改用交叉应用。看看下面的内容。

SELECT
  bt.Tag,
  *
FROM BlogTable AS bt
CROSS APPLY dbo.FunSpliteStr(bt.Tag, '،') FS
WHERE bt.IsEnglish = 0
AND bt.IsActive = 1
AND bt.IsDelete = 0

如果您仍然觉得 "need" 游标,请先尝试 运行 关闭和解除分配语句,然后再次尝试 运行 您的 while 查询。

试试这个:这也是一种方法

DECLARE @tag AS NVARCHAR(MAX)

SELECT @tag = COALESCE(@tag + ',', '') + bt.Tag
FROM   BlogTable AS bt
WHERE  bt.IsEnglish = 0
        AND bt.IsActive = 1
        AND bt.IsDelete = 0

SELECT *
FROM dbo.FunSpliteStr(@tag, '،')

虽然每个人都说您在这里不需要游标(因此您不应该使用它)是正确的,但在回答您的实际问题时:您应该在 CURSOR 关键字之后指定 LOCAL|GLOBAL :

DECLARE MY_CURSOR CURSOR LOCAL