web-dev-qa-db-ja.com

dboを必要としない関数を記述しようとしています。接頭辞

関数にアクセスするためにdbo.接頭辞が不要になるように、単純なシステム関数を記述しようとしています。 SQL Server 2000の例を見つけましたが、実行すると

EXEC SP_CONFIGURE 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE
go

create function system_function_schema.trim
    (@input varchar(max))
    returns  varchar(max)
as
begin
    declare @result varchar(max)

    select  @result = rtrim(ltrim(@input))

    return  @result
end
go

EXEC SP_CONFIGURE 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE

これはスローされたエラーです。

指定されたスキーマ名 "system_function_schema"は存在しないか、それを使用する権限がありません。重大度16

予想される使用法は

select trim('   padded value   ')

誰かが私が取るべきアプローチを知っていますか、それともdbo.のように呼び出さなければならない通常のユーザー定義関数として作成する必要があるかどうか:

select dbo.trim('   padded value   ')
2
Lance

System_function_schemaの使用は、SQL 2000では文書化されておらず、サポートされていませんでした。SQL2005以降、この処理はできなくなりました。

仕様上、UDFでは、スキーマを関数呼び出しに含める必要があります。

例外が1つあります。プロシージャのように関数を呼び出す場合、実際にはスキーマは必要ありませんが、関数にとってはそれほど役に立ちません。

exec trim @input = ' foo '

さらに、スカラー関数を使用してクエリを慎重にテストしてください。これらはパフォーマンスに大きな影響を与える可能性があります。

3
SQLFox

関数の場合は注意が必要です。おそらく関数を作成してから、Modelでそのシノニムを作成できます(Modelオブジェクトを継承するために作成される新しいデータベースに関数が必要な場合)。

マスターデータベースに関数を作成します。

:最初にsystem_function_schemaスキーマを作成する必要があります。

use master
go
create function system_function_schema.trim
    (@input varchar(max))
    returns  varchar(max)
as
begin
    declare @result varchar(max)

    select  @result = rtrim(ltrim(@input))

    return  @result
end
go

次に、関数を参照するSYNONYMを作成します(既存のデータベースの場合、既存のデータベースに作成する必要があります)。

USE model;
GO
CREATE SYNONYM dbo.trim FOR master.system_function_schema.trim;

これで、任意のデータベースで2部構成の名前でオブジェクトを参照できますが、コードのコピーを1つ保存するだけで済みます。

1
Kin Shah