2011-02-28 29 views
2

我曾在SQL Server数据库。现在我必须处理一个Sybase数据库(使用Squirrel客户端)。此查询不工作:为什么此查询在Sybase中不起作用?

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后,谁能告诉我,我错了

+0

@Mitch是的,因为所有其他查询工作正常。这真让我抓狂! – Mayank 2011-02-28 06:29:51

+0

哪个版本的SyBase? – 2011-02-28 06:34:29

+0

@Mitch Adaptive Server Enterprise/12.5.3/EBF 12156/P/ia64/HP-UX B.11.23/ase125x/1883/64位/ FBO/Thu Nov 18 10:53:44 2004 – Mayank 2011-02-28 06:41:06

回答

3

米奇指出获取语法是:

fetch cursor_name [into fetch_target_list] 

您还需要声明光标在一个单独的批次,这意味着你必须把“GO”之后声明声明。然后你会发现你的变量超出了范围,所以你需要移动它,以便它在“GO”之后。

您还需要检查@@ sqlstatus以查看提取的成功程度,而不是@@ 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行末尾不需要分号。

+0

我的松鼠客户端无法识别'GO'关键字!奇怪!另外为什么当我在SQL服务器上运行它时,我的变量没有超出范围,但只在SyBase上运行? – Mayank 2011-02-28 10:47:55

+0

该变量不会退出MS SQL中的范围,因为您不需要GO将其分成两批。 – AdamH 2011-02-28 10:52:17

+0

我从来没有用过松鼠,也许有一个控制它对GO的理解的设置。你可以在isql中试试吗? – AdamH 2011-02-28 10:53:02

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; 
+0

不起作用。现在我得到'必须声明变量'@ table_Name'。' – Mayank 2011-02-28 06:33:09

1

在游标后声明@tablename

0

首先松鼠支持'去'作为一个SQL批处理分隔符。转到菜单项Session - > Session Properties --->'SQL'选项卡。

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

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

在接下来的批次中,重新申报在早期批次中声明并将在第二批次中引用的变量。

这应该工作。这就是我多年来一直在测试涉及游标的SQL代码。

相关问题