2011-02-28 66 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代碼。