ユーザー定義のテーブル関数またはユーザー定義のプロシージャを作成する場合、名前を付けて関数またはプロシージャを呼び出すことができます。
ただし、ユーザー定義のスカラー関数では、スキーマを使用して呼び出す必要があります。
select dbo.doit(data);
他のDBMSではその動作に遭遇していません。なぜこれがスカラー関数に当てはまるが、残りには当てはまらないのですか?
これは病的な好奇心だけではありません。私が尋ねるのは知っています理由 Microsoft製品は非生産的な方法です。
スキーマがスカラー関数に必要で他のスキーマには必要でないという技術的な理由がある場合は、知っておく価値があります。これは他のDBMSの動作ではありませんが、ここに該当するのには技術的な理由がある可能性があります。
それは、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
があるのはなぜですか? NOWAIT
とNO_WAIT
の両方があるのはなぜですか? NULL
の代わりにBACKUP TO NUL
?あらゆる種類の歴史的なものが存在し、レビューなしのチェックイン、左手/右手。理由は通常、無関係、不明、または不十分です。
いずれにせよ、「なぜ」は本当に重要なのでしょうか。知ることでどんな技術的問題が解決しますか?理由はわかりませんが、マイクロソフトに問い合わせる必要があります。 - aaron-bertrand
補足:ほとんどのオブジェクトではスキーマ名を省略できますが、SQL Serverを使用する場合は、使用するすべてのオブジェクトにスキーマプレフィックスを追加することをお勧めします。そうしないと、予期しない動作や望ましくない動作が見られる場合があります。これに関するブログ投稿: 悪い癖:スキーマの接頭辞を避けるAaron Bertrand による randi-vertongen