Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 名为“MY_cursor”的游标已存在_Sql_Sql Server_Cursor - Fatal编程技术网

Sql 名为“MY_cursor”的游标已存在

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

我试图通过游标获取数据,如下面的代码,但得到的错误是:

名为“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_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