如何在选择查询中使用变量表名(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 解决方案][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】:执行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)的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个查询中将 Advantage ADT 表连接到 DBF 表?
在 Delphi 中获取 Advantage Database 查询的进度