【SQL Server】ストアドやユーザー定義関数で現在日付を取得

前は検索したらさくっと出てきたような気がしましたが、見つからないので拾い物ですが置いときます。

ストアドプロシージャやユーザー定義関数では、実行するごとに値の変わる関数は使えないのですが(例えばgetdateとか)、 それを別の方法で取得するやり方です。

ビューを使ってselect getdate()としといて、それを使う方法もありますが、こっちの方が汎用性がありそうなので参考に。

vbscriptを実行してその値を取得してるので、vbscriptでできることは全部できそう。あとWindowsのシェルにストアドからコマンドを投げる方法もあるので、やろうと思えばなんでもできる気がします。こことかを参考に。

以下、ユーザー定義関数で現在日時を取得するサンプルです。これをそのままクエリアナライザで実行して、select dbo.func_GetDate()とすれば実行結果を見れます。

CREATE FUNCTION func_GetDate()
RETURNS datetime AS
/***************************************
FUNCTION : getdate()が関数内で使えないのでこっちで現在の日付を取得
RETURN    : datetime
***************************************/
BEGIN
DECLARE @object int
DECLARE @hr int
DECLARE @ScriptText varchar(8000)
DECLARE @temp varchar(100)
DECLARE @return datetime

--スクリプトエンジンのロード
EXEC @hr = sp_OACreate 'MSScriptControl.ScriptControl', @object OUT
IF @hr <> 0 BEGIN return '' END --失敗時

-- Languageプロパティ設定
EXEC @hr = sp_OASetProperty @object, 'Language', 'VbScript'
IF @hr <> 0 BEGIN return '' END --失敗時

-- スクリプトリセット
EXEC @hr = sp_OAMethod @object, 'Reset'
IF @hr <> 0 BEGIN return '' END --失敗時

--スクリプト作成
Set @ScriptText = ''
Set @ScriptText = @ScriptText + 'Function GetDate()' + CHAR(13) + CHAR(10)
Set @ScriptText = @ScriptText + 'GetDate = Now()' + CHAR(13) + CHAR(10)
Set @ScriptText = @ScriptText + 'End Function' + CHAR(13) + CHAR(10)

--スクリプト設定
EXEC @hr = sp_OAMethod @object, 'AddCode',NULL,@ScriptText
IF @hr <> 0 BEGIN return '' END --失敗時

--項目取得スクリプトを実行する
EXEC @hr = sp_OAMethod @object, 'Run',@temp Out,'GetDate'
IF @hr <> 0 BEGIN return '' END --失敗時

--datetime型に変換
select @return = convert(datetime, @temp)

--オブジェクト破棄
EXEC @hr = sp_OADestroy @object
RETURN @return
END
--------------------------------------------------------------