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 State="34000"

第一个表 (tab1) 将创建,但其他 (tab2, tab3) 表不会。

如果我用 select sql 替换语句 execute(sql),脚本将正常工作。

提前感谢您的回答。

PX

4

3 回答 3

1

为什么不使用 while loop.using Cursor 在这些情况下过度使用。我不熟悉 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 ID=@index

      execute(@Sql)  

      SET @index = @index+1
    end
于 2012-08-14T18:32:22.650 回答
1

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

您需要使用 WITH HOLD 子句(或类似的东西)来保持光标打开。

于 2012-08-15T07:22:18.717 回答
0

我不是 sybase 专家,但看起来您在 fetch 语句中缺少下一个。

    fetch next cur into @sql
于 2012-08-14T19:49:16.420 回答