「ストアドプロシージャがMS SQL Server Management Studioで作成されていても、ストアドプロシージャが見つかりませんでした」


21

次の構造を持つテーブルtesttableをデータベース内に作成しましたtestbase

product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)

Microsoft SQL Server 2008 Management Studioを使用しました。

testtable_pricesmaller次のようにストアドプロシージャを作成しました

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go

Object ExplorerMicrosoft SQL Server Management Studioでストアドプロシージャを表示できます。(次のツリー構造にリストされていますObject Explorer

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller

次のエラーが表示された場合、非常に奇妙です。

Could not find the stored procedure 'dbo.testtable_pricesmaller'.

次のSQLステートメントを実行すると:

execute dbo.testtable_pricesmaller 50

何が欠けているのでしょうか?


実行ステートメントが「testbase」データベースのコンテキストで実行されていることを確認しましたか?USEステートメントを追加するか、オブジェクト名を完全修飾してみてください。
ショーンメルトン

はい、USEステートメントを追加しましたが、エラーが発生しました。
ジャック

実行ステートメントでデータベース名を明示的に定義する必要がありました:EXEC [testbase]。[dbo]。[testtable_pricesmaller] 50
Jroonk

回答:


17

IntelliSense Refreshローカルキャッシュで修正する必要があります


7

新しいストアドプロシージャを追加した後にデータベースを再起動する必要はありませんが、オブジェクトエクスプローラを更新してそこに表示する必要があります。

次回ストアドプロシージャを追加するときは、オブジェクトエクスプローラーから右クリック実行オプションを実行して、パラメーターを入力し、実行されるかどうかを確認してください。実行されない場合、問題が何であるかわかりません。実行された場合、SQLが間違ったデータベースからクエリを実行しようとしているような単純なものである可能性があります。


4

最後に、メッセージがMS SQL Server Management Studioに表示される理由がわかりました。

MS SQL Server Management Studioでは、ストアドプロシージャを作成した後に再起動する必要があります。

MS SQL Server Management Studioを再起動した後、そのようなエラーはもうありません。

(奇妙なことに、ストアドプロシージャを作成するたびに再起動する必要があるということですか?)


12
再起動する必要はありません。
ショーンメルトン

1
@ShawnMelton MS SQL Server Management Studioを閉じてから、MS SQL Server Management Studioを再度開きます。閉じてから再度開く必要があるのは非常に奇妙です。欠落している可能性のあるMS SQL Server Management Studio(SSMS)の構成はありますか?
ジャック

5
IntelliSenseは、あなたがやったことの唯一の遅れている部分です。execステートメントの実行は、SSMSを再起動せずに機能するはずです。動作しない原因となったものが他にもあります。@ShawnMeltonに同意します。
トーマスストリンガー

@Shark、面白い!なぜ私のSSMSが非常に奇妙であるように振る舞うのかを誰かに説明していただければ幸いです。
ジャック

6
将来の参照用:Ctrl-Shift-Rは、IntelliSenseのローカルキャッシュを更新します。
アダムシャープ

3

あなたの作成コマンドは

create procedure dbo.testtable_pricesmaller
    @pricelimit money

dbo.プロシージャ名の前にありません。プロシージャを作成するときは常に、プロシージャ名でユーザー/スキーマを明示的に定義することをお勧めします。つまり、プロシージャ名には完全修飾署名が必要です。

これがあなたのお役に立てば幸いです。


3

SQL Server 2008では、Windowsアカウントでログインした場合、SYSADMINセキュリティレベルがない場合、明示的にスキーマを指定せずにオブジェクトを作成すると、[DOMAIN \ username]。[ObjectName ] [dbo]。[ObjectName]の代わりに(これはSQL Server 2012で修正されたと思います)。

ユーザーのセキュリティレベルを下げたときにこの問題が発生し、彼が実行していたプロシージャの1つがスキーマなしでテーブルを削除および再作成していたため、オブジェクトに再度アクセスできなかったため、残りのプロシージャがクラッシュしました。テーブルがドメインユーザー名で作成されたことがわかりました。

この動作に関するMicrosoftの投稿は次のとおりです。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017(「暗黙的なスキーマとユーザー作成」セクションを探してください

dboスキーマの下にテーブルが作成されない

SQL 2008 R2は、Windowsユーザーがテーブルを作成するときにユーザー/スキーマを作成します

つまり、要するに、おそらくデータベースの問題(データベースにテーブルを作成したが、別のデータベースからアクセスしようとする)があるか、今説明したような問題があります。


2

私はこれが古いことを知っています。私はこのまったく同じ問題の解決策を探していたときにこの質問に出くわし、この質問を見つけた他の人にも役立つことを期待してこの答えを投稿しています。

私の場合、共有データソースを使用してSSRSレポートを実行しているときにエラーメッセージが表示されました。この共有データソースは既定のデータベース(Default Catalog =パラメーター)を指定していません。パスワードを持っていないため、接続文字列に追加できませんでした(SSRSデータソースで何かを変更すると、パスワードを再入力してください)。

これを解決するために、SQL Serverインスタンスのログインのデフォルトデータベースをmasterから、レポートが実行するストアドプロシージャを含むデータベースに変更しました。

SSMSから実行する場合、オブジェクトエクスプローラーペインは1つの接続であり、エディターはまったく別の接続であることに注意してください。そのため、オブジェクトエクスプローラーでSQL01のオブジェクトが表示される場合がありますが、エディターで実行しているコードはSQL02に対して実行されます。効く?」私の間違いに気づきました。エディターの場合は、右下隅を見て、接続しているインスタンスとデータベースを確認します。


1

TL; DR:存在しない別のストアドプロシージャを呼び出しているストアドプロシージャがあります。


私はこの問題を抱えていて、修正を見つけました。これが何が起こったのかです。ストアドプロシージャを1つ作成しました。

create procedure dbo.MyProc
    ...

次に、最初のストアドプロシージャを実行する別のストアドプロシージャを作成しました

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc
    ...

しばらくして、名前dbo.MyProcをに変更しましたdbo.MyProc2。名前を変更した後、を呼び出そうとするとdbo.MyProcCaller、次のエラーメッセージが表示されます。

exec dbo.MyProcCaller

ストアドプロシージャ 'RLM.usp_getSecondaryRestrictedLists_Old'が見つかりませんでした。

私の解決策は、新しい名前を使用するように2番目のストアドプロシージャを変更することでした。

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc2
    ...

この問題があるかどうかを確認する簡単な方法を次に示します。クリックしてストアドプロシージャのテキストを変更し、そのテキストを実行します。このような警告が表示された場合は、ストアドプロシージャの名前を変更する必要があります。

モジュール「dbo.MyProcCaller」は、欠落しているオブジェクト「dbo.MyProc」に依存しています。モジュールは引き続き作成されます。ただし、オブジェクトが存在するまで正常に実行できません。

(1行影響を受けます)


0

この質問は数年前のものですが、後で見つけた私のような人に別の可能性を投げ込みたいだけです。

このコマンドを実行しました:EXEC SP_CONFIGURE 'Agent XPs'

そして、説明されているエラーが発生しました:メッセージ2812、レベル16、状態62、行1ストアドプロシージャ 'SP_CONFIGURE'が見つかりませんでした。

しかし、このサーバーは大文字と小文字を区別するように設定されていることを思い出しました。したがって、このコマンドは問題なく機能しました。EXECsp_configure 'Agent XPs'

HTH

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.