#freeze
[[A5:SQL Mk-2>https://a5m2.mmatsubara.com/]]用スクリプト。

#contents()

* 「ツール」メニュー用 [#ubc43c79]

scripts\Toolフォルダにコピーして使う。

** クリップボードのSQLを整形しクリップボードに貼り付け [#n9a02b18]

 // クリップボードのSQLを整形しクリップボードに貼り付け
 if (Clipboard.hasText())
     Clipboard.asText = application.formatSql(Clipboard.asText);

- &attachref(FormatSql_20191102.zip);

** クリップボードのSQLを1行に整形しクリップボードに貼り付け [#k3c36b0b]

 // クリップボードのSQLを1行に整形しクリップボードに貼り付け
 if (Clipboard.hasText())
     Clipboard.asText = application.formatSqlLine(Clipboard.asText);

- &attachref(FormatSqlLine_20191102.zip);

** insert~select文のスケルトンコードを作成 [#y481cd7e]

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

- &attachref(InsertSelectDialog_20191106.zip);

* コンテキストメニュー用 [#r8481c10]

scripts\TreeTBフォルダにコピーして使う。

** insert~select文のスケルトンコードを作成 [#qc100ae1]

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