用循环生成数据表的grips变量大家好,
我用多个表名编写了执行SQL()数据表的循环。为了管理数据表,我试图为每个表创建一个夹点,但是失败了。
在下面的代码上需要大家的帮助
sql_code 1 = Expr( "..." );
sql_code 2 = Expr( "..." );
sql_code 3 = Expr( "..." );
list = { "sql_code 1", "sql_code 2", sql_code 3" };
For( k = 1, k <= N Items( list ), k++,
sub_list = list[k];
Eval list( Parse( "var_" || sub_list ) ) = Execute SQL( database_connection, Eval(Parse(list)), invisible, "Data Table_" || sub_list );
);祝你有美好的一天
回复:用循环生成数据表的grips变量 @黑轮 ,
您的脚本有几个问题。
- 实际的SQL应该是一个字符串/字符变量。
- 最后的项目清单缺少报价。
- 您试图在For循环中生成的命令行中缺少概念
JMP分配的左侧必须为左值 。本质上,L值必须是单词或名称,而不是表达式。
但是,我相信您正在尝试创建一个JMP命令,其中分配的左侧(=的左侧)是一个名称。
以下是来自“ JMP日志”窗口的信息
Parse(Eval Insert( "\[var_^sub_list^ = Execute SQL( database_connection, ^list[k]^, invisible, "Data Table_^sub_list^")]\" )) ;
/*:
var_sql_code 1 = Execute SQL(
database_connection,
sql_code 1,
invisible,
"Data Table_sql_code 1"
)
第一行生成一个有效的JMP表达式。如果将其用作Eval()函数的参数,并且您的数据库连接字符串和SQL代码没有错误,则查询应该可以正常工作。 请参阅下面的脚本。
为了帮助您了解JSL功能,请从JMP主菜单> 救命 > 脚本编制索引 > 功能 ,抬头:
- 评估插入()
- 解析()
- Eval(),和
- Execute SQL()的语法
sql_code 1 = "..." ;
sql_code 2 = "..." ;
sql_code 3 = "..." ;
list = { "sql_code 1", "sql_code 2", "sql_code 3" };
For( k = 1, k <= N Items( list ), k++,
sub_list = list[k];
Eval(Parse(Eval Insert( "\[var_^sub_list^ = Execute SQL( database_connection, ^list[k]^, invisible, "Data Table_^sub_list^")]\" )) ) ;
);
希望能有所帮助。祝好运!
回复:用循环生成数据表的grips变量除了遍历所有表意为每个SQL结果表创建一个动态变量名称之外,为什么不创建表列表呢?特别是如果您的SQL语句很复杂。
sql_code 1 = Expr( "..." );
sql_code 2 = Expr( "..." );
sql_code 3 = Expr( "..." );
list = { "sql_code 1", "sql_code 2", "sql_code 3" };
dt_list = {};
For( k = 1, k <= N Items( list ), k++,
sql_statement = list[k];
dt_list[k] = Execute SQL( database_connection, sql_statement, invisible, "Data Table_" || char(k) );
);
如果希望SQL语句成为新创建的表的一部分,则可以将其添加为表变量。
回复:用循环生成数据表的grips变量 @黑轮 ,
我完全同意皮特的观点, @pmroz 。表达式列表,列表列/变量,数据表名称或引用列表以及列表项顺序(k)匹配的代码易于阅读和维护,建议您使用它。
回复:用循环生成数据表的grips变量是的 @pmroz @ gzmorgan0 列表绝对比将某些字符串解析为变量要好。
除非您对所有三个表都做同样的事情,否则我什至不会将它们放在列表中。 我只是用描述性名称来命名变量。 第二个示例减少了行数,易于理解,并为您提供了命名变量,因此您不必记住哪个表是1、2和3。
Names default to here(1);
sqllist = {
"SELECT *
FROM People",
"SELECT *
FROM Places",
"SELECT *
FROM Things"
};
table_names = {"People", "Places", "Things"};
dt_list = {};
for(i=1, i<=nitems(sqllist), i++,
dt_list[k] = Execute SQL(dbc, sqllist[i], table_names[i])
);
// vs
dt_people = Execute SQL(dbc,
"SELECT *
FROM People",
"People"
);
dt_places = Execute SQL(dbc,
"SELECT *
FROM Places",
"Places"
);
dt_things = Execute SQL(dbc,
"SELECT *
FROM Things",
"Things"
);
如果所有表都具有相同的架构,那么我只需在列表中有一个sql语句列表,然后直接调用它即可。