2015-09-17 34 views
5

私は今、多くのスレッドをチェックしており、これに対する答えを見つけることができないと思われます。クライアントに返信する前にこれを前提にしていると確信する必要があります。SQL Serverはストアドプロシージャを実行する前にそれを検証しますか?

so、見出しの状態としてSQL Serverはストアドプロシージャを実行する前に検証しますか?

IE:私は特定の条件を満たしていることは決してありませんIF statementを持っている場合でも、そのIF statement conditionのコードがチェックされ、実行前に検証されますか?

EDIT:はここに簡単な例です:

DECLARE @ParamSource VARCHAR(2) = 'V3' 

IF @ParamSource = 'V1' 
BEGIN 
    --USE LINKED SERVER HERE WHICH THROWS AN ERROR ABOUT CONNECTIONS 
END 

IF @ParamSource = 'V3' 
BEGIN 
    --DO MY ACTUAL CODE 
END 

私はその最初の条件を満たしていることはありませんが、何らかの理由で、私のストアドプロシージャは、実行時に検証しようとしているとerroringを保持しています。

+0

これらは、最初にビルドされたときに(少なくとも部分的に)検証されますが、実行時には検証されません。ただし、これは決して検証されない動的SQLでは当てはまりません。これは個人的な経験から来たものであり、いかなる文書からでもありません。ただし、この理論をテストしたい場合は、テストテーブルに対して単純なストアドプロシージャを構築し、テストテーブルから列を削除することができます。ストアドプロシージャは実行を試みますが、エラーをスローします。 – user2366842

+0

@ user2366842-返信ありがとうございます...私がその行に沿って何かを検証したり何かをしていると思うのは、私が「災害復旧環境」をセットアップする過程にあり、IF文の1つがリンクされたどのような理由で接続することはできません(ただし、この条件を満たす必要はありません。私はこのコードを削除できますが、これはSQLが実行しているかどうかを知りたがっています) – Mike

+2

遅延名解決とコンパイル:https: //technet.microsoft.com/en-us/library/ms190686(v=sql.105).aspx(リンクが更新されました) – Pred

答えて

1

ストアドプロシージャが作成されると、ストアドプロシージャで使用される各オブジェクトが検証されることを意味してコンパイルされます。既存のすべてのオブジェクトに対して、それらにアクセスする必要もあります。これにより、このストアドプロシージャの実行プランが作成されます。プロシージャが変更されない限り、実行プランは有効なままでなければなりません。ストアドプロシージャで使用されるテーブルオブジェクトが存在しない場合(テーブルのみ、リンクされたサーバーではない場合)、この時点で実行プランは作成されませんが、その他のエラーがない場合はプロシージャが作成されます。

例では、ストアドプロシージャを作成するためにリンクサーバーオブジェクトにアクセスする必要があります。作成後、リンクサーバーにアクセスできなくなった場合でも、プロシージャは実行されますが、リンクサーバーIF @ParamSource = 'V1'にアクセスする必要がある場合はエラーが発生します。ただし、リンクサーバーIF @ParamSource = 'V3'にヒットしない場合は、エラーは発生しません。

基本的に、プロシージャを作成するユーザーは、リンクされたサーバーにアクセスする必要があります。

+0

ストアドプロシージャの再コンパイルに関する詳細:[リンク](https://technet.microsoft.com/en-us/library/ms190439(v=sql.105).aspx) – Philippe

関連する問題