如何在select查询中使用变量表名称(Advantage Data Architect)

时间:2014-11-06 17:02:39

标签: sql advantage-database-server

我正在使用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语句中的错误位置是:

我想问你,可能有人知道如何解决我的问题吗?

谢谢。

抱歉我的英文。

1 个答案:

答案 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中生成的结果,则必须将结果存储在某些表中。

另一种选择是使用存储过程,存储函数等。