ネタ元: 横持ちと縦持ち_その後2_SQL文は侮れない
表題のとおりなんですが、ad-hoc query なんてものは無くしちまえ!というのがおいらの意見。
唯一の例外は、運用や試験目的で sqlcmd を発行する時くらいでしょうか。
SQL 構文を教えるのが目的なら当然必要ですが、別の言語からの呼び出し方を教えるなら ad-hoc query を発行するやり方を教えると有害な面の方が大きいと思う。
というのは、下記弊害があるから。
-
SQL injection
Parameterized query を利用したからと言って SQL injection 全てを防げるわけではありませんが、間違いなく有効な方策です。SQL injection を防止するためには、parameterized query の発行方法と LIKE での escape を教えればいいかと。これをやっておくと code review で脆弱性を探すのが圧倒的に楽になるという利点も生まれます。何も考えずに ad-hoc query を発行した場合の結果は言わずもがな。
-
Compile 時間の増大
Ad-hoc query の場合、procedure cache に一致したものが無いとその都度 compile されます。この procedure cache というのが厄介で、SQL Server の場合、parameters が一個でも違っていたら一致しないのは当然として、case-sensitive なので SQL 構文が大文字小文字で異なっているだけで一致しないと判断されます。
-
Cache 有効活用
SQL Server 64 bit 環境だと procedure cache が事実上無制限に拡張します。32 bit 環境だと Windows 32 bit 環境の制約により 2 GB までに制限されていましたけど。ということで、procedure cache が無制限に拡張されるため、本当に必要な data cache 領域が圧迫されて cache を有効活用することができません。
もっとも、上記弊害まで一緒に教えるなら問題ないんですけどね。
このような問題があるので、この手の書き方を教える場合、ad-hoc query 発行方法は必須では無いです。ほとんどの処理は parameterized query で代用できるのでこっちこそ必須とすべきでしょう。両方ちゃんと教えるならともかく、ad-hoc query 発行方法だけ教えるのはあり得ない。
なお、上記は SQL Server 2005 までの環境を前提にしています。SQL Server 2008 ではちゃんと確認していないのでどなたか確認をお願いたします。おそらく同じだと思いますけど。。。