这给了我一个我想要执行的查询列表:
select CONCAT('ALTER TABLE ',table_name,' DROP edit_time;') AS query FROM information_schema.COLUMNS where column_name = 'edit_time' AND table_schema = 'homestead';
结果:
|query|
ALTER TABLE node_fields DROP edit_time;
ALTER TABLE node_list_role DROP edit_time;
ALTER TABLE node_list_versions DROP edit_time;
ALTER TABLE node_lists DROP edit_time;
.. (etc) ..
这将返回我要删除该字段的所有表的行。但有没有办法做这样的事情:
EXECUTE {that query}
或
FOREACH {results of that query} EXECUTE( {that row} )
我不太了解mysql程序或逻辑语句,所以这对我来说是新的。
答案 0 :(得分:0)
将所有文本选择到变量中并使用它创建prepared statement,然后您可以执行该变量。请注意,准备好的声明中有一些不允许的内容,可能包括您的表格修改。
编辑:正如@BerndBuffen在下面的评论中所提到的,您只能在预准备语句中一次执行一个查询。您需要遍历原始查询的结果集并一次执行一个 - 以下存储过程应该可以解决这个问题:
parseLogs(logs: Logs[]): void {
const ts: string[] = logs.map(data => data.time_Stamp.toString());
var timestamps = ts.filter((x, i, a) => x !== undefined && a.indexOf(x) === i);
var jsonString: string = '[';
for (var j = 0; j < timestamps.length; j++) {
var date = new Date(timestamps[j]);
var hours = date.getHours().toString();
if (date.getHours() < 10)
hours = '0' + hours;
var minutes = date.getMinutes().toString();
if (date.getMinutes() < 10)
minutes = '0' + minutes;
var dtString: string = (date.getMonth() + 1) + '-' + date.getDate() + '-' + date.getFullYear() + ' ' + date.getHours() + ':' + date.getMinutes();
jsonString = jsonString + '{"Time Stamp":"' + dtString + '"';
for (var i = 0; i < logs.length; i++) {
if (logs[i].time_Stamp === timestamps[j])
jsonString = jsonString + ',"' + logs[i].tagName + '":' + logs[i].value + '';
}
if (j === (timestamps.length - 1)) {
console.log('j:' + j + 'logs.length:' + logs.length.toString());
jsonString = jsonString + '}';
} else {
console.log('j:' + j + 'logs.length:' + logs.length.toString());
jsonString = jsonString + '},';
}
}
jsonString = jsonString + ']';
console.log(jsonString);
this.myLogs = JSON.parse(jsonString);
//From example shown above
this.generateColumnHeaders(this.myLogs);
...或者只是复制原始查询的输出行,将它们粘贴回客户端,然后全部运行; - )