Sql 名为“MY_cursor”的游标已存在
我试图通过游标获取数据,如下面的代码,但得到的错误是: 名为“MY_cursor”的游标已存在 我搜索并发现我应该在游标的定义中使用LOCAL单词,比如DECLARE MY_cursor LOCAL cursor,但再次出错 在DECLARE CURSOR语句中使用local选项无效 我怎样才能解决这个问题Sql 名为“MY_cursor”的游标已存在,sql,sql-server,cursor,Sql,Sql Server,Cursor,我试图通过游标获取数据,如下面的代码,但得到的错误是: 名为“MY_cursor”的游标已存在 我搜索并发现我应该在游标的定义中使用LOCAL单词,比如DECLARE MY_cursor LOCAL cursor,但再次出错 在DECLARE CURSOR语句中使用local选项无效 我怎样才能解决这个问题 DECLARE @tag AS NVARCHAR(1000) DECLARE @tempTbl AS TABLE (tagcol NVARCHAR(1000)) DECLARE MY_CUR
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
如果仍然需要游标,请尝试先分别运行close和deallocate语句,然后再次尝试运行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, '،')
虽然每个人都说这里不需要游标,因此不应该使用它,但在回答实际问题时:应该在游标关键字后指定LOCAL | GLOBAL:
标记您正在使用的dbms。该代码是特定于产品的。您的查询实际上不需要使用游标。我添加了DEALLOCATE MY_游标,但不同意这里的@Squirrel,这里不需要游标;这是可以实现的,没有一个。为什么要使用一个,programmer138200?我在所有包含字符串(如00,11,22,33)的记录中都有标记字段,我应该将这些值除以、charachter,然后选择all。我应该使用FunSpliteStr函数。您有其他解决方案吗?谢谢,这正是预期的响应
DECLARE MY_CURSOR CURSOR LOCAL