1. ホーム
  2. sql

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

2022-08-05 06:57:26

質問

ちょっとした行き詰まりを感じています。私はあるクエリを持っていて、それはいくつかの 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 インスタンス名とデータベース名を明示的に指定していることを確認します。