0

どういうわけかストアドプロシージャを作成したとき、それをストアドプロシージャフォルダ内に配置できましたが、システムストアドプロシージャフォルダ内には配置できませんでした(システムSPフォルダはストアドプロシージャフォルダ内にあります)。システムのストアドプロシージャフォルダに1レベル下に移動するにはどうすればよいですか?

編集:以下の回答を読んだ後、問題は、C#プログラムにストアドプロシージャにアクセスするように指示する方法にあると思います。例外をスローしている次のコード行があり、それが見つからないことを通知しています。

SqlCommand cmd = new SqlCommand("<database_name>.dbo.<stored_procedure_name>.sql", conn);

ストアドプロシージャを適切に呼び出す方法について誰かが助けを提供できるなら、それはありがたいです。どうも!

4

3 に答える 3

10

あなたはそうしない、あるいは少なくともそうすべきではない。

これはsystem、RDBMSに組み込まれ、systemオブジェクトの名前変更やサーバー上のユーザーのチェックなどの機能に使用されるストアドプロシージャ用です。

Stored procedureこれらをファイルシステムのようなフォルダとは考えないでください。既存のメタデータ(またはViewSystemオブジェクトまたはUserオブジェクト?)に基づいてオブジェクトを整理しているだけです。

システムオブジェクトとしてマークすることもできますが、それはひどい考えです。

なぜ手順を難読化したいのですか?あなたがそれを作成しているなら、それは明らかにユーザーの手順であり、システムの手順ではありません。

于 2012-07-31T16:08:16.630 に答える
6

なぜこれを行う必要があるのか​​はよくわかりませんが、次のことができます。

exec sp_ms_marksystemobject myprocname

文書化されていないため、使用しようとするとサポートがなくなり、SQLServerの将来のバージョンから削除される可能性があります。

于 2012-07-31T16:07:19.687 に答える
1

上記の@JNKのコメントは+1。

また、作成したと思われるスキーマの下にストアドプロシージャが作成されていることを確認してください。次のようなステートメントを実行すると、次のようになります。

create procedure foobar as ...

ストアドプロシージャは、デフォルトのスキーマでfoobar作成されますが、そうではない可能性があります。常に、少なくとも2レベルのスキーマ修飾名を持つデータベースオブジェクトを作成および参照する必要があります。dbo

create procedure dbo.foobar ...
create procedure some_schema.foobar ...

足を撃たないように。参照もスキーマ修飾する必要があります。のような参照

select * from some_table
exec some_stored_procedure

それよりも

select * from dbo.some_table
exec dbo.some_stored_procedure

最初に、デフォルトのスキーマで目的の名前とタイプのオブジェクトをプローブすることで解決されます。見つかった場合、それは参照を解決するために使用されるオブジェクトです。そのようなオブジェクトが見つからない場合は、スキーマの下でプローブが作成されますdbo

さらに、一般に、ストアドプロシージャに:で始まる名前を付けないでくださいsp_。これにより、解決がさらに複雑になり(速度が低下し)、データベースのプローブがmaster混在します。

于 2012-07-31T17:02:28.120 に答える