web-dev-qa-db-ja.com

ユーザー定義のスカラー関数にスキーマが必要なのはなぜですか?

ユーザー定義のテーブル関数またはユーザー定義のプロシージャを作成する場合、名前を付けて関数またはプロシージャを呼び出すことができます。

ただし、ユーザー定義のスカラー関数では、スキーマを使用して呼び出す必要があります。

select dbo.doit(data);

他のDBMSではその動作に遭遇していません。なぜこれがスカラー関数に当てはまるが、残りには当てはまらないのですか?

これは病的な好奇心だけではありません。私が尋ねるのは知っています理由 Microsoft製品は非生産的な方法です。

スキーマがスカラー関数に必要で他のスキーマには必要でないという技術的な理由がある場合は、知っておく価値があります。これは他のDBMSの動作ではありませんが、ここに該当するのには技術的な理由がある可能性があります。

5
Manngo

それは、Sybase/Microsoftが実装したときに決定したものだからです。 - a-horse-with-no-name

スキーマなしで関数を呼び出すと、システム関数または 組み込み関数 のみが検索され、スキーマSELECT dbo.getdate()で組み込み関数を実行すると、検索のみが行われると思いますユーザー定義関数。 - biju-jose

問題は、なぜスカラー関数で残りの関数ではないのですか?

おそらく、製品にスカラー関数が導入されたときに、最初からそれを強制できたためです。壊れる既存のコードの量が多かったため、他のオブジェクトに戻って強制することはできませんでした。彼らがターミネータなしのステートメントの廃止を発表したのと同じ理由ですが、実際にはそれはおそらく決して起こりません。また、スキーマプレフィックスは常にスキーマであるとは限らず、所有者を示すために使用されていたことにも注意してください。

(将来の)組み込み関数と名前を共有するスカラー関数を作成する場合、パーサーが意図を区別する必要があることを提供します。 SQL Server 2017ではSELECT doit()を検討し、SQL Server 2021ではdoit()という内部関数を追加します。

その他の場合(テーブル値関数)、FROMの後にあるため、パーサーはそれが何であるかについてより多くのヒントを得ます。しかし、これはもう当てはまりません。STRING_SPLIT()の場合-2016年に追加されました。string_split()という関数があると、動作の変化に驚かれる可能性があるためです。

あなたはあらゆる種類の「なぜ」の質問をすることができます。一部のALTER DATABASEコマンドにSET <feature> ONがあり、他のコマンドにはSET <feature> = ONがあるのはなぜですか? NOWAITNO_WAITの両方があるのはなぜですか? NULLの代わりにBACKUP TO NUL?あらゆる種類の歴史的なものが存在し、レビューなしのチェックイン、左手/右手。理由は通常、無関係、不明、または不十分です。

いずれにせよ、「なぜ」は本当に重要なのでしょうか。知ることでどんな技術的問題が解決しますか?理由はわかりませんが、マイクロソフトに問い合わせる必要があります。 - aaron-bertrand


補足:ほとんどのオブジェクトではスキーマ名を省略できますが、SQL Serverを使用する場合は、使用するすべてのオブジェクトにスキーマプレフィックスを追加することをお勧めします。そうしないと、予期しない動作や望ましくない動作が見られる場合があります。これに関するブログ投稿: 悪い癖:スキーマの接頭辞を避けるAaron Bertrand による randi-vertongen

11
user126897