質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

6567閲覧

【SQL SERVER】カーソルによる動的クエリの書き方

TAKAYASU

総合スコア146

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2017/09/20 14:46

いつもお世話になってます。

SQLSERVER 2014で動的クエリを作成中にふと疑問がでたので質問させて頂きます。
SELECT文を動的に作成する場合、以下のコードが存在したとします。(UNION前提)

SQL

1DECLARE @SQL NVARCHAR(4000), --SQL文格納用変数 2 @CD VARCHAR(2) --コード格納用変数 3 4DECLARE CUR CURSOR LOCAL FOR 5 SELECT CD FROM TESTDB.dbo.TEST_TBL --CDには1から10の文字列が取れると仮定 6 7OPEN CUR 8FETCH NEXT FROM CUR INTO @CD 9 10WHILE @FETCH_STATUS = 0 11BEGIN 12 SET @SQL = 'SELECT ' + @CD + ' UNION ' 13 FETCH NEXT FROM CUR INTO @CD 14END 15SET @SQL = SUBSTRING(@SQL,1,LEN(@SQL) - 7) -- 末尾のUNIONを省く 16 17CLOSE CUR 18EXECUTE(@SQL) 19 20OPEN CUR 21FETCH NEXT FROM CUR INTO @CD 22 23WHILE @FETCH_STATUS = 0 24BEGIN 25 SET @SQL = 'SELECT ' + @CD 26 FETCH NEXT FROM CUR INTO @CD 27 28 IF @FETCH_STATUS = 0 29 BEGIN 30 SET @SQL = @SQL + ' UNION ' --FETCH_STATUSが0のままであればUNIONを追加する 31 END 32END 33CLOSE CUR 34DEALLOCATE CUR 35EXECUTE(@SQL) 36

何れのループも1から10までの数値を出力します。
個人的な見解としてはループ文の中で完結している後者の書き方がよいではないのか?と考えていますが
ループ内で条件をつけるよりもループ後、末尾の文字列を排除すべきなのでは?という意見もあがり
書き方としてどちらが適しているのかがわからなくなりました。

書き方をご教示頂けますと幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こういった処理に限った訳では無いですけど、仕様に関わるものは除き、if文などによる分岐は少なければ良いと思っているので、前者です。

余談ですが、実際の動的SQLでの実装でもそうしてます。
でも、unionで繋ぐような実装はしたことはありません。(正規化により回避してきた)

投稿2017/09/21 01:27

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKAYASU

2017/09/21 13:02

回答ありがとうございます! やはり分岐が少ないほうがよいのですね。 大変勉強になりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問