みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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文の結合するテーブルを変更する事は可能なのでしょうか?
調べ方が悪いのか、ネットで検索しても解決方法がわかりませんでした。。。
どうかご教授お願い致します。

投稿日時 - 2013-06-22 03:05:38

QNo.8144248

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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)のように使い分けるとよいです。

投稿日時 - 2013-06-22 06:54:56

お礼

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

投稿日時 - 2013-06-26 01:47:41

あなたにオススメの質問