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

Posted

技术标签:

【中文标题】如何在选择查询中使用变量表名(Advantage Data Architect)【英文标题】:how to use variable table name in select query (Advantage Data Architect) 【发布时间】:2014-11-06 17:02:39 【问题描述】:

我正在编写相同的小型 sql 脚本,并且正在使用 Advantage Data Architect 11.10。

我的脚本的一部分是根据以下请求创建“光标”:

...
declare myCursor;
declare prefix char(4);
declare tableName char(10);
...
tableName = prefix + '_table1';
open myCursor as select * from tableName;
...

当我运行我的脚本时,我收到以下错误:

poQuery:错误 7200:AQE 错误:状态 = HY000;本机错误 = 7041; [iAnywhere 解决方案][Adv​​antage 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】:

执行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 内部产生的结果,您必须将结果存储在一些表中。

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

【讨论】:

非常感谢!你的回答对我很有帮助!

以上是关于如何在选择查询中使用变量表名(Advantage Data Architect)的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中使用动态表名编写 Select 查询?

如何在单个查询中将 Advantage ADT 表连接到 DBF 表?

在 Delphi 中获取 Advantage Database 查询的进度

oracle动态查询通过sql获取游标变量

不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名

oracle中如何对多张表进行动​​态选择查询?使用表名和列名作为其他表的值?