2012-08-14 62 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