Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 光标未打开_Sql_Sap Iq - Fatal编程技术网

Sql 光标未打开

Sql 光标未打开,sql,sap-iq,Sql,Sap Iq,我正在尝试使用存储在表中的语句创建表。我将游标与executesql一起使用,如下所示: 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 i

我正在尝试使用存储在表中的语句创建表。我将游标与executesql一起使用,如下所示:

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替换语句executesql,脚本将正常工作

提前谢谢你的回答


PX

为什么不使用while loop.using Cursor在这些场景中是过分的。 我不熟悉sybase语法,但在SQLServer2008中,您可以这样做

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 ID=@index

      execute(@Sql)  

      SET @index = @index+1
    end

我不是sybase专家,但您似乎错过了fetch语句的下一步

    fetch next cur into @sql

IQ喜欢在第一次提交后关闭光标


您需要使用WITH HOLD子句或沿着这些行的某些东西来保持光标打开。

下面有fetchexecute@SqlThanks谢谢你的回答!这是一个非常好的主意,我可能会使用你的代码。但是我仍然想知道为什么它不起作用。我希望您知道,在您当前的代码中,各个语句可以以任何顺序运行,因为您的游标定义中没有order BY。是的,我知道。没关系,这只是一个例子。我可能应该澄清一下IQ中的游标,但我被分心了。无论如何,在IQ中,保持游标非常昂贵,因为表版本控制它可能成为一个非常大的事务。以下是一些关于IQ游标/事务的简短介绍,请记住: