2012-08-14 85 views
1

我試圖使用存儲在表中的語句創建表。我使用的是執行(SQL)光標如下:光標未打開

create table tab 
(
    CreateSql varchar(250) 
) 

insert into tab values ('create table tab1 (id int)') 
insert into tab values ('create table tab2 (id int)') 
insert into tab values ('create table tab3 (id int)') 

    declare cur cursor for 
    select createsql 
     from tab 

    declare @sql varchar(255) 

    open cur 
    fetch cur into @sql 

    while @@SqlStatus = 0 
    begin   
     execute(@Sql)    
     fetch cur into @sql 
    end 

    close cur 
    deallocate cursor cur 

如果我運行它會出現一個錯誤:

無法執行的語句。遊標不開SQLCODE = -180,ODBC 3 狀態= 「34000」

第一個表(TAB1)將創建,但其他(TAB2,TAB3)表不。

如果我用select sql替換語句execute(sql),腳本將正常工作。

在此先感謝您的回答。

PX

+0

您知道,我希望您的當前代碼能夠以任意順序運行單個語句,因爲您的遊標定義中沒有ORDER BY。 – 2012-08-15 07:33:52

+0

是的,我知道。沒關係,這只是一個例子。 – Parado 2012-08-15 10:38:52

回答

1

IQ喜歡在第一次提交後關閉遊標。

您需要使用WITH HOLD子句(或沿着這些行的東西)來保持光標處於打開狀態。

+0

它解決了我的問題,非常感謝! – Parado 2012-08-15 10:40:24

+1

我大概應該在智商方面澄清一些關於遊標的東西,但我分心了。無論如何,HOLD遊標在IQ內部非常昂貴,因爲表版本化可能會成爲一個非常大的事務。以下是關於IQ遊標/交易記錄的一些非常簡短的介紹:http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00170.1510/html/iqapgv1/X100766 .htm – Hotel 2012-08-23 01:49:11

+0

非常有用,謝謝! – Parado 2012-08-23 08:29:19

1

你爲什麼不帶而loop.using光標是矯枉過正在這些情況下做到這一點。 我不熟悉Sybase語法,但在SQL Server 2008中,你可以做這樣的

create table tab 
(
    CreateSql varchar(250) 
    ,ID int IDENTITY(1,1) 
) 

insert into tab values ('create table tab1 (id int)') 
insert into tab values ('create table tab2 (id int)') 
insert into tab values ('create table tab3 (id int)') 

DECLARE @max INT = (SELECT MAX(ID) FROM tab) 
    ,@index int =1 
    ,@sql varchar(255) 


    while (@index<= @max ) 
    begin   

     select @sql= createsql from tab WHERE [email protected] 

     execute(@Sql) 

     SET @index = @index+1 
    end 
+0

感謝您的回答! 這是非常好的主意,我可能會使用你的代碼。但我仍然想知道爲什麼它不起作用。 – Parado 2012-08-14 21:54:02

0

我不是一個專家SYBASE,但它看起來像你缺少未來的fetch語句。

fetch next cur into @sql 
+0

有執行下面的執行(@Sql) – Parado 2012-08-14 21:50:52