質問: like演算子内に変数って使えないんですか? excelからsql serverの外部取り込みを行う際に vbaの条件文の1部にwhere(jobtbl.batchid like '12%')と書き 実行すると12から始まるデータの取得が正常に行われます。 実際には'12%'の箇所に当日日付を取得するようなものを書きたいので 変数t_day=format(now,"mmdd")を入れて where(jobtbl.batchid like 't_day%')で実行すると エラーは出ませんが結果が表示されません。 変数を使用することは出来ないのでしょうか? その場合、当日日付4桁から始まる列を含むテーブルを取得したい場合 どのようにすればよいでしょうか? ご教授ください。
回答: "where(jobtbl.batchid like '12%')" も変数に入っているものですよね? strsql = "(略)..where(jobtbl.batchid like '12%')" これなら sql server 側で認識されるsqlは (書くまでもないと思いますが) (略)..where(jobtbl.batchid like '12%') になります。 では、質問者様の書かれたsqlではどうでしょうか? t_day=format(now,"mmdd") strsql = "(略)..where(jobtbl.batchid like 't_day%')" sql server側で認識されるsqlは (略)..where(jobtbl.batchid like 't_day%') です。 つまり、『batchid が文字列「t_day」で始まるもの』となってしまいます。 vba側の変数t_dayの内容で渡したいわけですから、以下のようにします。 strsql = "(略)..where(jobtbl.batchid like '" & t_day & "%')" これなら、t_day が 1202 だとしたら、sql server 側で認識されるsqlは (略)..where(jobtbl.batchid like '1202%') となります。 この回答では簡便な方法で書きましたが、上記の方法は、本来は、プレースホルダによるパラメータバインドを使うべきです。 手入力の値ではないと言う事で、大丈夫だとは思いますが、sqlインジェクションを起こし易いセキュリティレスな方法なので好ましくないです。 一応、msdnの例が載っているところをリンクしておきます。 sqlcommand.prepare メソッド http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlcommand.prepare%28vs.71%29.aspx