MySQL中有没有办法从information_schema执行结果集

时间:2017-05-26 17:59:58

标签: mysql if-statement alter

这给了我一个我想要执行的查询列表:

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程序或逻辑语句,所以这对我来说是新的。

1 个答案:

答案 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);

...或者只是复制原始查询的输出行,将它们粘贴回客户端,然后全部运行; - )