web-dev-qa-db-ja.com

SQLServerは、ストアドプロシージャでユーザー定義関数関数を見つけることができません

いくつかの権限が間違っている必要がありますが、その方法がわかりません。次のコードは単純化されていますが、これを機能させることさえできません

CREATE FUNCTION ufTest 
(
    @myParm int
)
RETURNS int
AS
BEGIN
    DECLARE @Result int

    SELECT @Result = @myParm + 1

    RETURN @Result
END
GO

次に、ストアドプロシージャから関数を呼び出せるようにしたいだけです。

CREATE PROCEDURE dbo.[uspGetGroupProfileService]
@id        int
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @otherId int;
    SET @otherId = dbo.ufTest(@id);
END

SQLServerは、dbo.ufTestが見つからないことを通知し続けます。 [DB]\Programmability\Functions\Scalar-valued Functionsの下に表示されますが、使用方法がわかりません。

誰かが私が間違っていることを知っていますか?

[〜#〜]編集[〜#〜]

以下で選択した回答に示されているように、SSMSIntellisenseを常に信頼できるとは限りません。スクリプトを実行する以外に試すことができることの1つは、CTRL + SHIFT + Rを使用してIntellisenseを強制的に更新することです。

https://blog.sqlauthority.com/2013/07/04/sql-server-how-to-refresh-ssms-intellisense-cache-to-update-schema-changes/

16
Josh Russo

私のために働きます。

CREATE FUNCTION dbo.ufTest ...をお試しください

デフォルトのスキーマをdboにすることはできず、最終的には別のスキーマになると思います。そうでなければ、私が考えることができる唯一の説明は、あなたがそれに許可を与える必要があるかもしれないということです。

12
Martin Smith

まったく同じ問題があり、SQL Server ManagementStudioを再起動するだけで修正されました。

他の誰かがすべてを正しく行い、それでも彼の関数を呼び出すことができない場合に備えて、これを投稿するだけです。

3
jrdev22

UDFのスクリプトを作成し、スキーマ名を確認します。おそらくdboではありません。特にdboを含めるようにUDF定義を変更します。言い換えると:

CREATE FUNCTION dbo.ufTest 
3
Randy Minder

これがエラーであり、このコラムのすべてのアドバイスも失敗するという問題が発生しました。

関数宣言タイプとそのタイプの使用法を再確認してください。

戻り値の型のテーブルを宣言し、Select functionName()を使用する必要がある場所でSELECT * FROM functionName()を使用して呼び出しようとしました。

1
TylerSmall19

上記のいずれか、特に@ jrdev22の回答が役に立たなかった場合(そして理由がわからなくなった場合)の最後の手段として、SQL Serverを再起動しますservicein Configuration Manager SSMSを単独で再起動しても、すべてがリセットされない場合があるため(たとえば、新しいログインインスタンスを作成するが、それを使用してログインできない場合と同様) 。

SQL Server Configuration Manager> SQL Server Services > SQL Server > Restart
1
Derptastic

作成したばかりの関数が見つからない場合は、2つの理由があります。

  1. 間違った関数名を使用している場合は、dbo.function名を追加して取得する必要があります。
  2. また、正しい名前が入力されていて、更新後にオブジェクトエクスプローラーに存在しているにもかかわらず、関数を使用しようとすると見つからないなど、もう1つの問題が見つかりました。

この場合、SQLサーバーを閉じて再度開くだけで、関数が表示されるはずです。

0
K Saketh

クエリエディタのバグのようです。関数はツリーの適切な場所に表示されますが、関数にdbo.xxxxxxという名前を付けても、新しいセッションを閉じて開くまでクエリエディターに表示されません。その後、dboと入力すると表示されます。

関数の名前を変更すると、古い存在しない関数は使用できますが、新しい名前は使用できません。更新では、セッションを閉じて新しいセッションを開始するだけでは修正されません。

これがバグである可能性があると私が言う理由は、Table関数のアクセス許可プロパティにスキーマプロパティへの青いリンクが含まれているのに、Scalar関数には含まれていないためです。したがって、回避策があるかもしれない最初の場所でスキーマが設定される方法において、それはより深い嘘のバグである可能性があります。または、作業中のデータベースのスキーマが正しく設定されていない可能性があります。

うまくいけば、他の誰かがこの問題に光を当てることができます。

0
AdsFMS

セットではなくselectで呼び出してみてください。そして、outがdboスキーマに属していることを確認しましたか?

0
Malk