同じ名前のテーブルが2つあると思います。1つはスキーマ 'dbo'(dbo.PerfDiag)が所有し、もう1つはSQL Serverへの接続に使用されるアカウントのデフォルトスキーマ(のようなものuserid.PerfDiag)が所有しています。
スキーマオブジェクト(テーブルなど)への非修飾参照(スキーマ名で修飾されていないもの)がある場合、オブジェクト参照を解決する必要があります。名前解決は、指定された名前を持つ適切なタイプ(テーブル)のオブジェクトを次の順序で検索することによって行われます。名前は最初の一致に解決されます。
- ユーザーのデフォルトのスキーマの下。
- スキーマ「dbo」の下。
非修飾参照は、上記のシーケンスの最初の一致にバインドされています。
一般的に推奨される方法として、パフォーマンス上の理由から、常にスキーマオブジェクトへの参照を修飾する必要があります。
参照がバインドされたスキーマは、ストアドプロシージャまたはクエリを実行する資格情報に応じて変わる可能性があるため、修飾されていない参照は、ストアドプロシージャまたはクエリのキャッシュされた実行プランを無効にする可能性があります。これにより、クエリ/ストアドプロシージャが再コンパイルされ、パフォーマンスが低下します。再コンパイルすると、コンパイルロックが解除され、他のユーザーが必要なリソースにアクセスできなくなります。
名前解決は、可能性のあるバージョンのオブジェクト(「dbo」が所有する)に解決するために2つのプローブを作成する必要があるため、クエリの実行を遅くします。これは通常のケースです。単一のプローブが名前を解決するのは、現在のユーザーが指定された名前とタイプのオブジェクトを所有している場合のみです。
[詳細に編集]
その他の可能性は(順不同)です。
- 自分が思っているデータベースに接続していません。
- 自分が思っているSQL Serverインスタンスに接続していません。
接続文字列を再確認し、SQL Serverインスタンス名とデータベース名が明示的に指定されていることを確認してください。