1. ホーム
  2. sql

[解決済み] SQL Server は「無効なカラム名」を報告するが、カラムは存在し、マネージメントスタジオでクエリが動作する

2022-02-07 13:53:56

質問

ちょっと行き詰まりました。私は、いくつかの C# のコードがあります。このクエリは Microsoft SQL Server Management Studio を同じデータベースに対して実行した場合。

しかし、私のコードで同じクエリを実行しようとすると、無効なカラムに関する同じエラーが表示され、例外がスローされます。このカラムを参照するクエリーはすべて失敗しています。

問題のカラムは、最近データベースに追加されました。という日付カラムです。 Incident_Begin_Time_ts .

失敗する例としては

select * from PerfDiag 
where Incident_Begin_Time_ts > '2010-01-01 00:00:00';

のような他のクエリもあります。 Select MAX(Incident_Being_Time_ts); も、コードで実行すると、カラムがないと判断して失敗します。

何か思い当たることはありますか?

解決方法は?

同じ名前のテーブルが2つあるのではないでしょうか?1つはスキーマ 'dbo' が所有している ( dbo.PerfDiag )、もう一方はSQL Serverへの接続に使用されるアカウントのデフォルトスキーマが所有するものです(以下のようなものです。 userid.PerfDiag ).

スキーマオブジェクト(テーブルなど)に対する非修飾の参照(スキーマ名で修飾されていない参照)がある場合、オブジェクトの参照を解決する必要があります。名前の解決は、指定された名前を持つ適切な型(テーブル)のオブジェクトを以下の順序で検索することで行われます。名前は最初に一致したものに解決される。

  • ユーザーのデフォルトスキーマの下で。
  • スキーマ'dbo'の下にあります。

非限定参照は、上記のシーケンスで最初のマッチにバインドされます。

一般的な推奨事項として、次のようにします。 常に パフォーマンス上の理由から、スキーマオブジェクトへの参照を修飾します。

  • なぜなら、ストアドプロシージャやクエリを実行する認証情報によって、参照先のスキーマが変更される可能性があるからです。この結果、クエリやストアドプロシージャが再コンパイルされ、パフォーマンスが低下します。再コンパイルにより、コンパイルロックが解除され、他の人が必要なリソースにアクセスするのをブロックすることになります。

  • 名前解決は、オブジェクトの可能性の高いバージョン('dbo'が所有するもの)に解決するために2つのプローブが必要なため、クエリの実行が遅くなります。これは通常の場合です。1つのプローブで名前解決ができるのは、現在のユーザーが指定された名前と型のオブジェクトを所有している場合だけです。

[さらに注意を喚起するために編集]。

その他の可能性としては(順不同)。

  • あなたが思っているデータベースには接続されていません。
  • あなたが考えているSQL Serverインスタンスに接続されていません。

接続文字列を再確認し、SQL Serverインスタンス名とデータベース名を明示的に指定していることを確認してください。