すでに公開した、Excel のみで SQL を実行できる、自画自賛の SQL 検証ツールだ。
今回は、実行する SQL文でバインド変数を使えるように改修してみたぞ。
ex.
while sheet1@テストマスタ.項番 = sheet2%param1
sheet2 の任意セルに、範囲がsheet2の"名前" を定義すれば、当該セルの内容を param1 として SQLに渡すことができる
注意点
・範囲がブックの"名前"は処理されない
・テーブル名と同様に、SQL文と同一シートにある"名前"はシート名を省略して記載できる
... sheet1 の SQL で sheet1 の"名前" param2 を使う ⇒ "sheet1%param2" or "%param2"
・"名前"のセル範囲中、左上のセルの値が受け渡される
・"名前"の示すセルの表示形式が文字列(@)の場合、SQLにはシングルクォート(')の引用符が自動付加される
以下、バインド変数を付加し、リテラルの確認を付加したSQLのサンプルだ
select 本人.項番
,本人.氏名 as 本人氏名
,家族.*
,'123abc' as リテラル
,"123abc" as リテラル2
from sheet1@testtable as 本人
INNER JOIN sheet2@家族 as 家族
on 本人.項番 = 家族.社員番号
where 本人.項番 = '1'
and 家族.項番 > sheet1%param1
バインドに直接関係ないが、本マクロSQLやExcelSQLの文法上の制限をまとめた
本マクロのSQL文法は、ExcelSQL文法(AccessSQL)にテーブル名指定法とバインド変数指定法を拡張したものだ
・本マクロのSQL文法/テーブル指定法
[<シート名>]@<excelテーブル名>
・本マクロのSQL文法/バインド変数指定法
[<シート名>]%<シート範囲の"名前">
シート名、テーブル名は半角英数、全角カタカナひらがな漢字、半角アンダーバーが使用できる
全角認識はアバウトなので許してくれ
・ExcelSQL文法/変数型
基本的にバリアント型なので、数値のように扱えば数値、文字のように扱えば文字としてふるまう
しかし、SQL中にリテラルを記述する場合、明確に文字列として記載するので、テーブル項目側も型を明確にする必要がある
具体的には、Excelテーブル(表組)中で文字列として扱う項目のデータは、表示形式を文字型に設定しなくてはいけない
1.バリアントのままSQLで使用する場合
data = ABC
2.文字型であることを明確にする場合
data = 'ABC' または data = "ABC"
・ExcelSQL文法/引用符
ダブル/シングルクォート("),(')のどちらでも使用できるが、文字列型バインド変数の場合シングルクォートを付加している
ただしセル中では先頭のシングルクォートは非表示となり、実際のデータからも排除される
先頭にシングルクォートを記載しなくてはいけない場合、手前に1文字の半角スペースを付加して、シングルクォートが消えないように留意しろし
Ora2MsSQL.bas ※2020/11/27更新
SQL.bas ※2020/11/27更新