2008.02.26

SQLServer2005 ユーザー定義関数内で非決定的関数が使用できる

最近知ったことですが、
SQLServer2005になって、
ユーザー定義関数内で非決定的関数が使用できるようになりました。

非決定的関数とは、GetDate()など、呼ぶ状態によって
返す値の違う関数をいいます。
http://msdn2.microsoft.com/ja-jp/library/ms178091.aspx

例えば、以下のように現在日付を文字列として返す関数を作りたい場合、
SQLServer2000では、引数で現在日付を渡す必要があります。

-- SQLServer2000では、こう書くしかない
CREATE   FUNCTION dbo.uf_GetDateStr(@rdDate DATETIME) RETURNS VARCHAR(8)
AS 
BEGIN

-- yyyymmddの文字列を返す
return CONVERT(VARCHAR(8), @rdDate , 112)

END

-- 呼び出し方
SELECT dbo.uf_GetDateStr(GetDate())

SQLServer2005では仕様が変わり、
非決定的関数も、ユーザー定義関数内で書くことができるようになりました。
よって、上の関数は、以下のように書き直せます。

-- SQLServer2005では、こう書ける
CREATE   FUNCTION dbo.uf_GetDateStr() RETURNS VARCHAR(8)
AS 
BEGIN

-- yyyymmddの文字列を返す
return CONVERT(VARCHAR(8), GetDate() , 112)

END

-- 呼び出し方
SELECT dbo.uf_GetDateStr()

単純に、引数が一つ違うだけですが、
わかり切った値を、引数として、わざわざ渡すのは、
あまり気持ちの良いものではありません。

以前のコードが動けば、そのまま何の疑問もなく
使用していましたが、
バージョンが変わった場合には、
もっとうまく書けるようになっていないか、
気にかけておくと良いのではないでしょうか。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
takefuji