久々に、SqlServerにて、ストアドプロシージャを作成することになり、素人状態からの疑問壁にぶち当たり苦労しましたので備忘録にしました。
ストアドプロシージャが作成できない謎
過去のブログの見て思い出しながら、ストアドを作成してみましたが、何回やってもストアドプロシージャが作成できません。
全く良くわかりませんが、「ストアドプロシージャ」右クリックして、「ストアドプロシージャ」をクリックするとサンプルのようなクエリが出現するので、それを加工したら作成することができました。
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE test_dayo AS BEGIN SET NOCOUNT ON; END GO
※コメントの部分と余計な部分は削除しました。(test_dayoが作成するストアド)
オブジェクト名が無効
ストアドが作成されて、変更から中身を確認すると、ストアド名に赤いくねくねの下線が出現していました。
マウスポインタを上に持っていくと、
さらに詳しく
オブジェクト名'test_dayo'が無効です。
というコメントが出てきました。
調べてみると、「Management Studio起動時にオブジェクト一覧がキャッシュされるため、起動以降に追加されたオブジェクトを認識できずに線がでます。」との事ですが意味が理解できません。
対策としては、
参考
手動でキャッシュを更新する方法は Ctrl + Shift + R
または、メニューバーの編集→InteliSense→ローカルキャッシュの更新
で赤い下線が無くなりました。
INT関数が使えない
Accessでは普通に使っていた、INT関数が使えないようです。
あーーめんどくさい!同じマイクロソフトなのに・・・。
ネット検索すると、親切にも、Access関数と、SqlServer関数の対応比較表を掲載してくれている方がいました。
ココがおすすめ
INT関数は、FLOOR関数に置き換えればOKのようです。
Dlookup関数に対する関数が無い
INT関数のように、Dlookup関数に対応する関数を探しましたが、存在しないようです。
なんて?・・・SQLから求められるからでしょうかね!?
消費税率を保管しているテーブルから、10%の10を取り出すだけなのですが、下記の様なSQLを作成しました。
DECLARE @tax_value INT SELECT @tax_value=TAX FROM [dbo].[tax] WHERE [JNO]=1
これで、JNO=1のレコードにある、TAXである、10を、@tax_value に代入することができました。
割り算すると、少数がだせない謎
DECLARE @tax_value INT DECLARE @tax_calc FLOAT SELECT @tax_value=TAX FROM [dbo].[tax] WHERE [JNO]=1 select @tax_calc = @tax_value / 100 PRINT @tax_calc
ものすごく簡単な計算ですが、
ココに注意
10割る100なので、0.1となるところが、0になる
なんでこんな簡単な計算ができないの!?
この情報を調べるだけで半日を潰してしまいました。
やっと情報を「SqlServerでの除算時の少数」という記事を見つけて乗り越えられました。
DECLARE @tax_value INT DECLARE @tax_calc FLOAT SELECT @tax_value=TAX FROM [dbo].[tax] WHERE [JNO]=1 select @tax_calc = convert(float,@tax_value)/100 PRINT @tax_calc
整数同士で割り算をすると、整数が返ってくる仕様らしい。本当に困惑です。