こんにちは、しゅんです!
病院勤務からエンジニアになって2ヶ月経ちました。
仕事の流れはつかめてきましたが、
業務の中で他の職場の先輩が発する言葉の中には、知らない単語が当たり前のように、大量にでてきます。
二ヶ月経っても日々脳内はパニック状態です( ;∀;)
その都度Google先生にお世話になっていますが、
これからは合間を見つけて、noteに備忘録を残していきたいと思います。
きっと間違った解釈をしてしまっていることもあると思うので、あまりあてにしないでください。笑
間違っている箇所は、暖かくご指摘いただけると嬉しいです。
動的SQLとは?
実行するときにSQL文を作り出し実行します。
つまり、コンパイル時(作成したSQLを登録するとき?)には未完成の状態。
SQLを実行するときに、何かしらの引数を受け取って初めて完成するSQL文。
(例)
「〇〇を削除する」というSQL文 ←動的SQL
実行するときに、「住所」という引数を渡すことで
「住所を削除する」という完成した文が実行される
みたいな感じですかね?
動的SQLの対義語は静的SQLというらしいです。
静的SQLのメリット
〇 性能がいい!
〇 コンパイルが正常終了した時点で、参照しているDB・オブジェクトが間違っていないこと、必要な権限があることを確かめることができます。
基本的には静的SQLを使いましょう
動的SQLのメリット
実行するまで分からない情報を反映できます。
ユーザーが入力する情報、前後の処理の結果を使用する場合など。
予めSQL文を完成することが不可能な場合に活躍するのが動的SQLです!
調べたきっかけ
今回調べることになったきっかけは、
僕がしたある質問に対して、先輩が確認するために書いてくれたクエリが意味不明だったからです。その中に動的SQLが使われていました。
質問の内容としては、
子SPを使用するSPを作成する際に、
子SPから取得したSELECT結果を直接INSERT INTOで一時テーブルに受け取れることができるのか、一時テーブルの指定したカラムに正しい順番で入るのかを
実際にSSMSで動かして確認したい、というもの。
さらさらっと書いて、「ほら、ちゃんとできるよ!」と。
かっこいい。
sp_executesqlという組み込みストアドプロシージャを使用します。
sp_executesqlを使えば、変数に格納したsqlを実行することができます。
思い出しながら、僕が作成した確認クエリはこちら。
use master
create table a (
A int NOT NULL
,B int null
)
CREATE table #test(
a int
,b int
)
INSERT INTO a
SELECT 6,7 UNION all
SELECT 8,9
DECLARE @a nvarchar(2000)
SET @a = 'SELECT A,B FROM a'
INSERT INTO #test
EXEC sp_executesql @a
SELECT * FROM #test
a b
1 6 7
2 8 9
無事に確認できました。
さいごに
覚えることはアホほどあってきりがないけど、
確認方法さえ覚えておけば、その都度確認できるから覚える量を減らせる。
丸暗記したものは時間がたつとあいまいになるけど、
確認したものは確実。
確認方法は、他にも応用が利く。
全く別業界で1から学ぶ際のコツなのかなと思います!
〜〜
過去にnoteで書いていたやつ、Qiitaに移動しました〜
数ヶ月前ですがはるか昔のことのように感じます。。
今は入職して9ヶ月目になりました。
職場ではSQL書いたり、案件のマネジメント補佐的なことをしてます。
家ではSQL全くしておらず、
web系のフロントとバックエンドを5:5くらいの感じで勉強してます
最近ははJavaScriptの「これさえできれば何でもできる感」に魅力を感じていて
Reactとか触ってます。
時々気が向いたらそのへんの内容を更新しますね!
参考記事
sq_executesql の使い方 - 月のあかり - IT編SQLの文字列を組み合わせて作成をし、動的に発行するプログラムをVBやC#などアプリケーションで作成したことがあると思う。rezev-hikaru.hatenadiary.org
静的SQLと動的SQLitdoc.hitachi.co.jp
動的SQLのコーディングotndnld.oracle.co.jp