2 番目の例では、これを行うことができます。
CREATE FUNCTION dbo.ConvertDate(@d CHAR(10))
RETURNS DATE
AS
BEGIN
RETURN (SELECT CONVERT(DATE, @d));
END
GO
しかし、より柔軟なアプローチは次のようになります。
CREATE FUNCTION dbo.ConvertRegional
(
@d CHAR(10),
@style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
RETURN (SELECT CONVERT(CHAR(10), CONVERT(DATE, @d), @style));
END
GO
DECLARE @d CHAR(10);
SELECT @d = '20120428';
SELECT
dbo.ConvertDate(@d),
dbo.ConvertRegional(@d, 101),
dbo.ConvertRegional(@d, 103),
dbo.ConvertRegional(@d, 120);
結果:
---------- ---------- ---------- ----------
2012-04-28 04/28/2012 28/04/2012 2012-04-28
ソーステーブルから不正な日付以外を除外し続けたくない場合 (ISDATE() を WHERE 句に保持することで、関数がそれらの行を処理する必要がなくなります)、回避するためにこの方法で関数を変更できます。エラー、代わりに NULL を使用しても問題ない場合:
CREATE FUNCTION dbo.ConvertRegional
(
@d CHAR(10),
@style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
RETURN (SELECT CASE WHEN ISDATE(@d) = 1 THEN
CONVERT(CHAR(10), CONVERT(DATE, @d), @style)
END);
END
GO
SQL Server 2012 では、代わりにこれを行うことができます。これにより、独自の CASE を作成しなくても同じことが行われます。
CREATE FUNCTION dbo.ConvertRegional
(
@d CHAR(10),
@style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
RETURN (SELECT CONVERT(CHAR(10), TRY_CONVERT(DATE, @d), @style));
END
GO
(実際、SQL Server 2012 では FORMAT() を使用することもできるため、スタイル番号を覚える必要はありませんが、使用しているバージョンがわからないため、別の日にします。)
とはいえ、クエリでいくつかのキーストロークを節約する以外に、このカプセル化は実際にクエリのパフォーマンスを低下させます (クエリが使用される場所によって異なります)。このような単純な変換では、ほとんどの場合、インラインで実行する方がはるかに優れています。