名称为 '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
我尝试通过游标获取数据,例如下面的代码,但出现错误:
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