A5:SQL Mk-2用スクリプト。
「ツール」メニュー用
scripts\Toolフォルダにコピーして使う。
クリップボードのSQLを整形しクリップボードに貼り付け
// クリップボードのSQLを整形しクリップボードに貼り付け
if (Clipboard.hasText())
Clipboard.asText = application.formatSql(Clipboard.asText);
クリップボードのSQLを1行に整形しクリップボードに貼り付け
// クリップボードのSQLを1行に整形しクリップボードに貼り付け
if (Clipboard.hasText())
Clipboard.asText = application.formatSqlLine(Clipboard.asText);
insert~select文のスケルトンコードを作成
SQLite3 / Oracle 12cで動作を確認している(修正すればSQL Server 2017 Expressでも動作する)。既存のレコードをコピーする際、特定の列(プライマリキーとか)の値だけ変えるような場合に。
フォーム側:
object Form: TForm
BorderStyle = bsDialog
Caption = 'insert~select文のスケルトンコードを作成'
ClientHeight = 120
ClientWidth = 300
Position = poMainFormCenter
object pnlTop: TPanel
Align = alTop
Height = 80
object lb1: TLabel
Caption = '対象のテーブル(&T):'
FocusControl = cmbTableNames
Left = 10
Top = 10
end
object cmbTableNames: TComboBox
DropDownCount = 50
Left = 10
Style = csDropDownList
TabOrder = 0
Top = 30
Width = 280
end
end
object btnExecute: TButton
Caption = '作成(&X)'
Default = True
Left = 10
TabOrder = 1
Top = 87
end
object btnClose: TButton
Cancel = True
Caption = '閉じる(&C)'
Left = 210
TabOrder = 2
Top = 87
end
end
スクリプト側:
// insert~select文のスケルトンコードを作成
class InsertSelectDialog extends VCLForm {
var path = WScript.Path + 'scripts\Tool\';
var connection = null;
function InsertSelectDialog(main, conn) {
this.connection = conn;
this.loadFromFile(new File(this.path + 'InsertSelectDialog.dfm'));
this.main = main;
this.btnExecute.onClick = btnExecute_Click;
this.btnClose.onClick = btnClose_Click;
var tableList = this.connection.getTableListEx(this.connection.getSchemaName());
tableNames = new Array();
for (i in tableList) {
if (!tableList[i].isView && !tableList[i].isSystem && !tableList[i].isSynonym)
tableNames.add(tableList[i].tableName); // tableNames.add(tableList[i].name); だと スキーマ名.テーブル名 になる
}
//var tableNames = this.connection.getTableList('[' + this.connection.getSchemaName() + ']'); // SQL Server 2017 Express
tableNames.sort();
for (i in tableNames)
this.cmbTableNames.Items.add(tableNames[i]);
if (this.cmbTableNames.Items.Count > 0)
this.cmbTableNames.ItemIndex = 0;
}
function btnExecute_Click(sender) {
if (this.cmbTableNames.ItemIndex < 0) {
alert('テーブルがありません');
return;
}
var tableName = this.cmbTableNames.Items(this.cmbTableNames.ItemIndex);
var columnList = this.connection.getTableColumnList(tableName);
var columns = new Array();
for (i in columnList)
columns.add(columnList[i].columnName);
var sql = 'insert into ' + tableName + ' (' + columns.join(', ') + ') select ' + columns.join(', ') + ' from ' + tableName + ' where 1 = 0';
application.newSqlEditor(application.formatSql(sql));
//application.newSqlEditor(application.formatSqlLine(sql)); // 1行に整形する場合はこちら
this.close();
}
function btnClose_Click(sender) {
this.close();
}
}
var conn = application.dbTree.getSelectedDatabaseConnection();
if (isUndefined(conn)) {
alert('データベースに接続してください');
exit();
}
var dlg = new InsertSelectDialog(true, conn); dlg.showModal();
新規SQLエディタに出力されたSQLを、
insert into TEST(id, name, remark) select id , name , remark from TEST where 1 = 0
select/where句など適宜修正して使う。
insert into TEST(id, name, remark) select id + 1000000000 , name , 'id=' || cast(:id as TEXT) || 'のコピー' from TEST where id = :id
コンテキストメニュー用
scripts\TreeTBフォルダにコピーして使う。
insert~select文のスケルトンコードを作成
SQLite3 / SQL Server 2017 Expressで動作を確認している。
// insert~select文のスケルトンコードを作成
var conn = application.dbTree.getSelectedDatabaseConnection();
var itemName = application.dbTree.getSelectedItemName();
var columnList = conn.getTableColumnList(itemName);
var columns = new Array();
for (i in columnList)
columns.add(columnList[i].columnName);
if (columns.length > 0) {
var sql = 'insert into ' + itemName + ' (' + columns.join(', ') + ') select ' + columns.join(', ') + ' from ' + itemName + ' where 1 = 0';
application.newSqlEditor(application.formatSql(sql));
}