我正在使用Advantage Data Architect 11.10编写相同的小sql脚本。
我的脚本的一部分是创建游标'基于以下要求:
...
declare myCursor;
declare prefix char(4);
declare tableName char(10);
...
tableName = prefix + '_table1';
open myCursor as select * from tableName;
...
当我运行脚本时,出现以下错误:
poQuery:错误7200:AQE错误:状态= HY000; NativeError = 7041; [iAnywhere Solutions] [Advantage SQL] [ASA]错误7041:找不到文件。 验证指定的路径和文件名是否正确。表名: tableName **脚本错误信息: - 错误的位置 SQL语句
我明白这意味着此错误消息,我试图在互联网上找到答案。
解决我的问题的方法之一是动态创建sql。
我找到了一些如何在Advantage Data Architect中使用动态sql的示例,但这些示例不起作用。 我创建了以下代码:
...
declare @test string;
...
set @test = 'open myCursor as select * from ' + tableName;
execute(@test);
...
当我运行脚本时,出现以下错误:
未找到预期的词汇元素:期待关键字 EXECUTE关键字后的PROCEDURE,IMMEDIATE,DPRINT或PRINT。 - SQL语句中的错误位置是:
我想问你,可能有人知道如何解决我的问题吗?
谢谢。
抱歉我的英文。
答案 0 :(得分:1)
执行dynamic SQL in ADS的语法是:
DECLARE @my_table TEXT;
@my_table = 'abc';
EXECUTE IMMEDIATE 'DELETE FROM ' + @my_table;
如果你想在动态SQL中use a cursor,你必须在你想要执行的字符串中声明游标:
DECLARE @sql TEXT;
DECLARE @crlf TEXT;
@crlf = CHAR(13) + CHAR(10);
@sql = 'DECLARE cursor1 CURSOR AS SELECT * FROM ' + @mytablename + ';' + @crlf
+ 'DECLARE @maxid Integer;' + @crlf
+ '' + @crlf
+ 'OPEN cursor1;' + @crlf
+ '@maxid = 0;' + @crlf
+ '' + @crlf
+ 'WHILE FETCH cursor1 DO' + @crlf
+ ' IF cursor1.id > @maxid THEN' + @crlf
+ ' @maxid = cursor1.id;' + @crlf
+ ' END IF;' + @crlf
+ 'END WHILE;' + @crlf
+ '' + @crlf
+ 'CLOSE cursor1;' + @crlf
+ '' + @crlf;
EXECUTE IMMEDIATE @sql;
如果您想使用外部SQL中生成的结果,则必须将结果存储在某些表中。
另一种选择是使用存储过程,存储函数等。