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)); }