Sql 光标未打开
我正在尝试使用存储在表中的语句创建表。我将游标与executesql一起使用,如下所示: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
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游标/事务的简短介绍,请记住: