A5:SQL Mk-2

Last-modified: 2019-11-20 (水) 23:02:20

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