1

テーブルに格納されたステートメントを使用してテーブルを作成しようとしています。以下のように、execute(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) テーブルは作成されません。

ステートメント execute(sql) を select 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 に答える