为什么此查询在Sybase中不起作用?

时间:2011-02-28 06:23:59

标签: sybase

我曾在SQL Server数据库上工作过。现在我必须处理Sybase数据库(使用Squirrel客户端)。此查询无效:

    DECLARE @tableName VARCHAR(500);
DECLARE my_cursor CURSOR FOR
  SELECT name
  FROM   sysobjects
  WHERE  type = 'U';
OPEN my_cursor;
FETCH NEXT FROM my_cursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
  BEGIN
      //Do something here
      FETCH NEXT FROM my_cursor;
  END
CLOSE my_cursor;
DEALLOCATE CURSOR my_cursor; 

它给出了一个错误 - Incorrect syntax near the keyword 'FROM'. SQLState: ZZZZZ ErrorCode: 156 Error occured in: FETCH NEXT FROM my_cursor INTO @table_Name现在这在SQL Server数据库中工作正常(在我将最后一行更改为DEALLOCATE my_cursor之后。有人可以告诉我哪里出错了吗?

3 个答案:

答案 0 :(得分:7)

正如Mitch所指出的,fetch语法是:

fetch cursor_name [into fetch_target_list]

您还需要在单独的批处理中声明游标,这意味着您必须在declare语句后面加上“GO”。然后,您将发现您的变量超出了范围,因此您需要将其移动到“GO”之后。

您还需要检查@@ sqlstatus以查看fetch的成功程度,而不是@@ FETCH_STATUS,我认为它只是MSSQL。

DECLARE my_cursor CURSOR FOR
  SELECT name
  FROM   sysobjects
  WHERE  type = 'U'
go

DECLARE @tableName VARCHAR(500)
set nocount on
OPEN my_cursor
FETCH my_cursor INTO @tableName

WHILE @@sqlstatus = 0
  BEGIN
      --Do something here

      FETCH my_cursor INTO @tableName
      print @tablename
  END

CLOSE my_cursor
DEALLOCATE CURSOR my_cursor

Sybase ASE中的行末尾不需要分号。

答案 1 :(得分:1)

DECLARE @tableName VARCHAR(500);
DECLARE my_cursor CURSOR FOR
  SELECT name
  FROM   sysobjects
  WHERE  type = 'U';

OPEN my_cursor;
FETCH my_cursor INTO @tableName;

WHILE @@FETCH_STATUS = 0
  BEGIN
      //Do something here

      FETCH my_cursor INTO @tableName;
  END

CLOSE my_cursor;
DEALLOCATE CURSOR my_cursor;

答案 2 :(得分:0)

首先,Squirrel支持'go'作为SQL批处理分隔符。转到菜单项会话 - >会话属性---> 'SQL'标签。

滚动到底部并将“Statement Separator”设置为“go”(不需要引号)。

然后按照上一个答案。 'DECLARE CUROSR'可以是批处理中唯一的SQL语句,因此必须在其后插入'go'。

在下一批中重新声明在先前批次中声明的任何变量,并将在第二批中引用。

这应该有效。这就是我多年来一直在测试涉及游标的SQL代码的方法。