環境

  • DBMS = SQL Server 2005ぐらい

ストアドプロシージャの戻り値

  • どうやら、ストアドプロシージャ(PROCEDURE)は戻り値として、数値しか返却できない。
  • いろいろなデータ型を返却したいときにはストアドファンクション(FUNCTION)を使うようだ。
  • ちょっと練習してみる。

ストアドファンクション作成

CREATE FUNCTION testfunc
( @str nvarchar(max)
 , @len int = 3
)
RETURNS nvarchar(max)
AS
BEGIN
    RETURN LEFT(@str,@len);
END;

第2引数を省略して実行

select dbo.testfunc('ABCDEFG')

メッセージ 313、レベル 16、状態 2、行 1
プロシージャまたは関数 dbo.testfunc に指定された引数が不足しています。
  • えぇ?エラー?なぜ?ちゃんと @lenにdefault値を指定しているのに…
  • ググるとストアドファンクションソースはいくつもヒットするが、default値指定しているfunctionが見当たらない…
  • 途方に暮れ、Books Onlineと同じだよなーと思いつつ、当然のようにヒットしているMSDNを読む。
[ = default ]
パラメータの既定値です。default 値が定義されている場合は、パラメータに値を指定せずに関数を実行できます。 
  • そうだよね。できるはず。でも省略したらエラーになるんです。
関数のパラメータに既定値がある場合に、既定値を取得する目的でその関数を呼び出すときは、
DEFAULT キーワードを指定する必要があります。この動作は、ストアド プロシージャで既定値
を持つパラメータを使用する場合とは異なります。ストアド プロシージャの場合は、パラメータ
を省略すると既定値が暗黙的に使用されます。
  • え?“DEFAULT”って記述するってこと?
  • 正しい第2引数を省略して実行
select dbo.testfunc('ABCDEFG', DEFAULT)
---------------------------------------
ABC

(1 行処理されました)
  • できました。なぜPROCEDUREと同じじゃないんでしょう…まさかオーバーロードできる…わけないですね。

facebook slideshare rubygems github qiita