ユーザーがデフォルトのスキーマ(dbo)でマップされ、スキーマにプレフィックスを付けずに[dbo]の下のすべてのテーブルを選択できる場合。
デフォルトのスキーマの下にある場合、プレフィックスなしでストアドプロシージャを実行できます。
それでは、なぜ関数の前にスキーマを付ける必要があるのでしょうか。
ありがとう!
では、なぜdboの下に作成された、プレフィックスなしの関数(スキーマ)を呼び出すことができるのでしょうか。
スカラー式が使用されている場合、スカラー値関数を呼び出すことができます。これには、計算列とCHECK制約定義が含まれます。スカラー値関数は、EXECUTEステートメントを使用して実行することもできます。 スカラー値関数は、少なくとも関数の2部構成の名前を使用して呼び出す必要があります。
したがって、これは基本的にSQL Server開発チームによって設定された制限であり、私はそれを非常に正しいと考えています。 (会話のために)どういうわけか許可されているとしても、スキーマ接頭辞を使用します。
追加しなくても機能する場合でも、常にスキーマ名の使用をサポートしています。これはベストプラクティスであり、どんなに冗長でも、すべての「優れた」開発者が使用します。
私が目にするもう1つの理由は、データベースエンジンがgetdate ()
のようなシステム関数とユーザー定義関数を区別するために何かを必要とすることです。スキーマ名なしで関数を呼び出すことが許可されている場合、データベースエンジンはGetdateという名前のユーザー作成関数とシステムのGETDATE()関数をどのように区別しますか。
もう1つの回答は、これは制限であり、理由ではないことを説明しています。
要件は常に真ではありません。スカラーUDFはEXEC
- edでも、暗黙の解決を使用できます( 例 )
これは名前の衝突を避けるためだと思います。
スキーマなしで関数の参照が許可されている場合、2000または2005でたまたまcrypt_gen_random
と呼ばれる独自の関数を作成した人は、2008年に組み込み関数の名前になったため、新しいバージョンにアップグレードするときに問題が発生します。 。
組み込み関数はそのように呼び出すことができないため、exec
の使用にはあいまいさはありません。