【実務・中級編】【ヒアドキュメント擬似再現】ArrayとJoinを活用した長文SQL・HTMLテンプレートの可読性向上と動的パラメータ埋め込み – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【ヒアドキュメント擬似再現】ArrayとJoinを活用した長文SQL・HTMLテンプレートの可読性向上と動的パラメータ埋め込み

業務自動化の現場において、VBScriptは今なおレガシーシステムとの統合やキッティング、簡単なバッチ処理において現役で稼働し続けている。
しかし、VBScriptの開発において誰もが一度は直面し、そして絶望するのが「長文の文字列連結地獄」ではないだろうか。

数行にわたるSQLクエリや、スタイルの当たったHTMLメールの本文を組み立てようと、ダブルクォーテーションの嵐と`&`演算子、そして改行文字(`vbCrLf`)の山を築いた経験はないだろうか。

‘ 【アンチパターン】保守性ゼロの文字列連結
Dim sql
sql = “SELECT U.User_ID, U.User_Name, D.Dept_Name ” & vbCrLf & _
“FROM M_User U ” & vbCrLf & _
“LEFT JOIN M_Dept D ON U.Dept_ID = D.Dept_ID ” & vbCrLf & _
“WHERE U.Delete_Flg = 0 AND U.Update_Date >= ‘” & targetDate & “‘”

この書き方は、行末の `& _` の付け忘れによる構文エラー、改行漏れによるSQLの構文崩壊、そして何より「書いた本人ですら1ヶ月後には読めない」という致命的な保守性の低さを生み出す。

プロフェッショナルなエンジニアであれば、コードの美しさはそのまま品質に直結することを知っているはずだ。
今回は、VBScriptにネイティブ実装されていない「ヒアドキュメント」の概念を、`Array`関数と`Join`関数を用いて極限までエレガントに擬似再現し、実務に耐えうる堅牢なテンプレートシステムを構築する手法を伝授する。

なぜ従来の文字列連結は「悪」なのか?

パフォーマンスとメンテナンス性の観点から、従来の `&` 演算子による文字列連結を整理しておこう。

1. 可読性の欠如: SQLやHTMLのインデント(階層構造)が完全に破壊される。
2. 結合ミスの温床: 改行コードやスペースの入れ忘れにより、`SELECT U.User_IDFROM` のような不正なクエリが生成される。
3. エスケープの苦痛: 文字列内にダブルクォーテーション(`”`)を含める際のエスケープ処理(`””`)が複雑化し、視認性をさらに悪化させる。

これを解決するために、一部で `ADODB.Stream` や外部ファイル読み込みを行うアプローチもあるが、スクリプト単体としての「可搬性(ポータビリティ)」が損なわれる。
単一の `.vbs` ファイルだけで完結し、かつ直感的に記述できる手法――それが `Array` + `Join` パターンである。

アーキテクチャ:ArrayとJoinによるヒアドキュメント擬似再現

仕組みは極めてシンプルだ。
テキストの各行を配列の要素として定義し、それらを改行コード(`vbCrLf` または `vbLf`)で結合する。

Dim sqlTemplate
sqlTemplate = Join(Array( _
“SELECT”, _
” U.User_ID,”, _
” U.User_Name,”, _
” D.Dept_Name”, _
“FROM”, _
” M_User U”, _
“LEFT JOIN”, _
” M_Dept D ON U.Dept_ID = D.Dept_ID”, _
“WHERE”, _
” U.Delete_Flg = 0″, _
” AND U.Update_Date >= ‘{0}'” _
), vbCrLf)

このアプローチの優れている点は、「元のテキストのフォーマット(インデントや改行)をそのまま配列内に維持できる」という点にある。開発者は、SQLエディタやHTMLエディタで書いたコードを、ほぼそのままの形でVBScript内に移植できる。

実践!プロダクションコード:動的パラメータ埋め込みの実装

単に文字列を結合できるだけでは実務では足りない。動的な条件(日付やID、宛先名など)を安全かつスマートに埋め込む仕組みが必要だ。
ここでは、C#の `String.Format` のようなプレースホルダー置換関数(`Replace` のラッパー)を組み合わせた、実務でそのまま使えるテンプレート構築クラス・モジュール的な実装例を示す。

以下のコードをコピーし、`.vbs` ファイルとして保存して実行してほしい。

Option Explicit

‘ ==============================================================================
‘ メイン処理プロセス
‘ ==============================================================================
Sub Main()
‘ 1. パラメータの定義(動的データ)
Dim targetDept, thresholdDate
targetDept = “開発部”
thresholdDate = “2023-10-01”

‘ 2. テンプレートの構築(Array + Joinによるヒアドキュメント擬似再現)
Dim rawSql
rawSql = Join(Array( _
“SELECT”, _
” U.User_ID,”, _
” U.User_Name,”, _
” D.Dept_Name,”, _
” U.Last_Login”, _
“FROM”, _
” M_User U”, _
“INNER JOIN”, _
” M_Dept D ON U.Dept_ID = D.Dept_ID”, _
“WHERE”, _
” D.Dept_Name = ‘{0}'”, _
” AND U.Last_Login >= #{1}#”, _
“ORDER BY”, _
” U.Last_Login DESC” _
), vbCrLf)

‘ 3. パラメータのバインド(置換処理)
Dim finalSql
finalSql = rawSql
finalSql = Replace(finalSql, “{0}”, targetDept)
finalSql = Replace(finalSql, “{1}”, thresholdDate)

‘ 4. 結果の出力(実務ではここにDB実行処理が入る)
WScript.Echo “— 生成されたSQLクエリ —” & vbCrLf & finalSql

‘ ==========================================================================
‘ おまけ:HTMLメールテンプレートの例
‘ ==========================================================================
Dim recipientName, reportUrl
recipientName = “管理者”
reportUrl = “https://intranet.example.com/reports/daily.html”

Dim htmlTemplate, finalHtml
htmlTemplate = Join(Array( _
““, _
““, _
“, _
““, _

スポンサーリンク

日次バッチ処理 完了通知

“, _

{0} 様

“, _

本日のバッチ処理が正常に完了しました。

“, _

レポートを確認する

“, _


“, _

Automated System by WSH

“, _
““, _
“” _
), vbCrLf)

finalHtml = htmlTemplate
finalHtml = Replace(finalHtml, “{0}”, recipientName)
finalHtml = Replace(finalHtml, “{1}”, reportUrl)

WScript.Echo vbCrLf & “— 生成されたHTMLテンプレート —” & vbCrLf & finalHtml

End Sub

‘ 処理の実行
Call Main()

現場でエンジニアが陥る「罠」とチーフアーキテクトからの助言

この手法は非常に強力だが、VBScriptという言語特性上、以下の点に注意しなければバグを生む原因となる。

1. 配列の要素数とパフォーマンスの誤解

「配列の要素数が多すぎるとメモリやパフォーマンスに悪影響があるのでは?」と心配する向きもあるかもしれない。
しかし、通常の業務で使用する数十行〜数百行程度のSQLやHTMLテンプレートであれば、人間が認知できる限界の範囲内であり、パフォーマンスへの影響は完全に無視できるレベル(数マイクロ秒オーダー)である。それよりも可読性向上による保守コスト削減のメリットの方が圧倒的に大きい。

2. ダブルクォーテーションのエスケープ

SQL内の文字列リテラルや、HTMLの属性値でダブルクォーテーション(`”`)を使いたい場合、VBScriptでは `””` と二重にする必要がある。

‘ HTML属性での例

これが煩わしい場合は、HTMLテンプレート側ではシングルクォーテーション(`’`)を多用することで、エスケープの手間を軽減できる(前述のHTMLサンプルコードを参照)。

3. SQLインジェクションに対する意識

今回紹介した `Replace` によるパラメータ埋め込みは、あくまで「ローカルで実行するバッチ処理やファイル出力、内部ツール」の可読性を上げるためのものである。
もしこのSQLを外部からの入力値と組み合わせてADO経由でデータベースに投げる場合は、必ずパラメータオブジェクト(`Command` オブジェクトと `Parameter` コレクション)を使用すること。文字列置換だけでSQLを組み立てるのは、どれほどコードが美しくともセキュリティ上の重大な脆弱性(SQLインジェクション)を生むため、絶対に避けてほしい。

総括:レガシーな環境下でも「美しいコード」は作れる

VBScriptは古い言語であり、モダンな言語にあるような洗練されたシンタックス・シュガーは備わっていない。
しかし、言語仕様の隙間を突き、既存の関数(`Array` と `Join`)を組み合わせることで、ここまで洗練されたテンプレートシステムを構築することが可能だ。

「動けばいいや」という雑な文字列連結で後々の保守担当者を苦しめるのは、プロフェッショナルとしての誇りが許さないはずだ。
ぜひ、あなたの次の自動化スクリプトからこの手法を取り入れ、誰が見ても美しい、堅牢なコードベースを築き上げてほしい。

タイトルとURLをコピーしました