• 締切済み

SQLServer2008のSQLを可変にする方法

SQL初心者です。 以下の3つのテーブルを条件によって結合したり、しなかったりを行いたいのですが、そもそもSQLServerのストアドプロシージャでそれが実現出来るのかもわかりません。。。。 どなたかご教授をお願い致しますm(_ _)m 使用するテーブルは以下の3つです。 1.ITEM_MST 項目: ITEM_CD, ITEM_NM, BUMON_CD 2.BUMON_MST 項目:BUMON_CD, BUMON_NM, CLASS_CD 3.CLASS_MST 項目:CLASS_CD, CLASS_NM, LOCAL_CD 実行するSP------------------------------------------------ test_SP( @引数1 , @引数2 ) SPの中で実行されるSQL-------------------------------------- SELECT ITM.ITEM_CD, ITM.ITEM_NM, BMN.BUMON_NM FROM ITEM_MST ITM INNER JOIN BUMON_MST BMN ON BMN.BUMON_CD = ITM.BUMON_CD WHERE ITM.CD = @引数1 ------------------------------------------------------------ 上記のSQLに対して、もし「@引数2 = 1」だったら CLASS_MSTテーブルを結合してLOCAL_CDの昇順で表示する以下のSQLを追加して表示させたいです。 INNER JOIN CLASS_MST CLS ON CLS.CLASS_CD = BMN.CLASS_CD ORDER BY CLS.LOCAL_CD そもそも引数によって、SQL文の結合するテーブルを変更する事は可能なのでしょうか? 調べ方が悪いのか、ネットで検索しても解決方法がわかりませんでした。。。 どうかご教授お願い致します。

みんなの回答

  • uams
  • ベストアンサー率63% (100/157)
回答No.1

SQL Serverで使っているSQLは「Transact-SQL」と言います。このキーワードで調べれば、リファレンスからノウハウ、実例など大量に出てきますので、まずはこれを参考にしてみてください。 ご質問の内容については、If構文を使ってできます。簡単に書くと次の2つパターンがあります。Begin~Endなどの基礎構文は除いてますので、実際はManagement Studio上でデバッグしながらお試しください。 (1)クエリーを呼び分ける方法 If @引数2 = 1   SELECT ~   FROM ~   INNER JOIN ~   WHERE ~   ORDER BY ~ Else   SELECT ~   FROM ~   WHERE ~ (2)クエリーの文字列を作って呼び出す方法 declare @query varchar(3000) declare @select varhcar(500) = "SELECT ~ " declare @from varchar(500) = "FROM ~ " declare @inner_join varchar(500) = "INNER JOIN ~ " declare @where varchar(500) = "WHERE ~ " declare @order_by varchar(500) = "ORDER BY ~" If @引数2 = 1   set @query = @select + @from + @inner_join + @where + @order_by Else   set @query = @select + @from + @where execute @query こんな感じです。(2)の方法なら、どんな複雑なパターンでも対応できるので応用性が高く、メンテナンス性も高い((1)では同じSELECT句を2箇所に書く必要があって間違いの温床になりがち)です。逆に(1)は手っ取り早くできるので、単純な分岐なら(1)、複雑な分岐なら(2)のように使い分けるとよいです。

a_ta_ka
質問者

お礼

ご回答ありがとうございます。 (2)についてですが、今回のプロジェクトの規約として動的SQLが禁止となっていますので (1)の方法で実装することにいたします。 また、調べ方についてもご教授頂きましてありがとうございました。

関連するQ&A