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