愚者の経験

「また今度」はほとんどこない

月別アーカイブ: 6月 2013

[SQL]動的にin句を変化させるような時の代替案

ふと気づいた。

        select *
        from table1
        where id in(@param)

というような形で「@paramに動的な複数値をカンマ区切りで渡したい」と
いう要望は結構ある。しかしこの状態では期待した結果にならないので
executeやsp_executesql(動的SQL実行)を使う

        execute ('select * from table1 where id in('+@param+')')

これは期待通りの結果になるのだが、いかんせんAccessと相性が悪いため
(カラム名が解決できないのでコントロールソースが手入力になるなど)SQLCLRを使って
カンマ区切りをテーブルにして返す関数(Split)を作成すると良いと最初は思いました。

苦労してSQLCLRを調べたりしたんですがそんなことしなくてもできます。
もちろん動的実行しなくてもできます。こうすればよかったんです…。

        select *
        from table1
        where ','+@param+',' like '%,'+cast(id as varchar)+',%'

なんでもっと早く気づかなかった自分…orz
多分インデックスも効くんじゃないかな。