次の構造を持つデータベース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
microsoft SQL Server Management StudioのObject Explorer
でストアドプロシージャを表示できます。 (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
何が欠けているのでしょうか?
やっと、メッセージがMS SQL Server Management Studioに表示される理由がわかりました。
MS SQL Server Management Studioでは、ストアドプロシージャを作成した後で再起動する必要があります。
MS SQL Server Management Studioを再起動すると、そのようなエラーは発生しなくなりました。
(奇妙なことに、ストアドプロシージャを作成するたびに、それを再起動する必要があるということですか。)
IntelliSense Refreshローカルキャッシュで修正する必要があります
新しいストアドプロシージャを追加した後、データベースを再起動する必要はありませんが、オブジェクトエクスプローラーを更新してそこに表示する必要があります。
次にストアドプロシージャを追加するときは、オブジェクトエクスプローラーから右クリック実行オプションを実行してパラメーターを入力し、実行されるかどうかを確認してください。それが実行されない場合、私はあなたの問題が何であるかわかりません。実行される場合、SQLが間違ったデータベースからクエリを実行しようとしているような単純なものである可能性があります。
あなたの作成コマンドは
create procedure dbo.testtable_pricesmaller
@pricelimit money
不足していますdbo.
プロシージャ名の前。プロシージャを作成するときは常に、プロシージャの名前でユーザー/スキーマを明示的に定義することをお勧めします。つまり、プロシージャ名には完全修飾シグネチャが必要です。
これがお役に立てば幸いです。
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 (セクション「暗黙的なスキーマとユーザーの作成」)
SQL 2008 R2は、Windowsユーザーがテーブルを作成するときにユーザー/スキーマを作成します
つまり、簡単に言うと、データベースに問題がある(データベースにテーブルを作成したが、別のテーブルからアクセスしようとしている)か、先ほど説明したような問題があるということです。
私はこれが古いことを知っています。私はこの非常に同じ問題の解決策を探していたときにこの質問に出くわしました。この質問を見つける他の人を助けるためにこの回答を投稿しています。
私の場合、共有データソースを使用してSSRSレポートを実行しているときにエラーメッセージが表示されました。この共有データソースは既定のデータベース(既定のカタログ=パラメーター)を指定しておらず、パスワードがないため接続文字列に追加できませんでした(そして、SSRSデータソースで何かを変更すると、パスワードを再入力してもらいたい場合)。
これを解決するために、SQL Serverインスタンスのログインのデフォルトデータベースをマスターから、レポートで実行する必要のあるストアドプロシージャを含むデータベースに変更しました。
SSMSから実行する場合、オブジェクトエクスプローラーペインは1つの接続であり、使用しているエディターはまったく異なる接続であることに注意してください。したがって、オブジェクトエクスプローラーでSQL01のオブジェクトが表示されることがありますが、エディターで実行しているコードはSQL02に対して実行されます-私はこの問題に数年にわたって何度も遭遇しました。うまくいくの?」私の間違いに気づきました。エディターの場合、右下隅を見て、接続しているインスタンスとデータベースを確認します。
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行が影響を受けました)
この質問は数年前のものですが、後で見つけた私のような人に別の可能性を投げかけたいと思います。
次のコマンドを実行しました:EXEC SP_CONFIGURE 'Agent XPs'
記載されているエラーが発生しました:メッセージ2812、レベル16、状態62、行1ストアドプロシージャ 'SP_CONFIGURE'が見つかりませんでした。
しかし、このサーバーは大文字と小文字を区別するように設定されていることを思い出しました。したがって、このコマンドは正常に機能しました:EXEC sp_configure 'Agent XPs'
HTH