SQL Serverは「無効な列名」を報告しますが、列は存在し、クエリはManagement Studioを通じて機能します


107

ちょっと行き詰まりました。一部の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);も、列がないと判断するため、コードで実行すると失敗します。

何か案は?


ケースに問題があるのでしょうか?おそらく、Management Studioは大文字と小文字を区別しませんが、データベースにアクセスする他の方法はより厳密です。
オリバー

1
コードでManagement Studioと同じデータベースを処理していますか?
rlb.usa 2011

3
C#で作成した列名とクエリしようとする列名が完全に同じであることを確認しますか?あなたの質問では、あなたが二回書いている「事件は_ 始め _ Time_tsを」と「事件は_一度ビーイング _ Time_ts」を。
クリスチャンスペクト2011

1
@Oliver:大文字と小文字の区別は接続ごとではありません。これは、データベース/ SQLサーバーオプションです。
ニコラスキャリー、

回答:


65

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

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

  • ユーザーのデフォルトのスキーマの下。
  • スキーマ「dbo」の下。

非修飾参照は、上記のシーケンスの最初の一致にバインドされています。

一般的に推奨される方法として、パフォーマンス上の理由から、常にスキーマオブジェクトへの参照を修飾する必要があります。

  • 参照がバインドされたスキーマは、ストアドプロシージャまたはクエリを実行する資格情報に応じて変わる可能性があるため、修飾されていない参照は、ストアドプロシージャまたはクエリのキャッシュされた実行プランを無効にする可能性があります。これにより、クエリ/ストアドプロシージャが再コンパイルされ、パフォーマンスが低下します。再コンパイルすると、コンパイルロックが解除され、他のユーザーが必要なリソースにアクセスできなくなります。

  • 名前解決は、可能性のあるバージョンのオブジェクト(「dbo」が所有する)に解決するために2つのプローブを作成する必要があるため、クエリの実行を遅くします。これは通常のケースです。単一のプローブが名前を解決するのは、現在のユーザーが指定された名前とタイプのオブジェクトを所有している場合のみです。

[詳細に編集]

その他の可能性は(順不同)です。

  • 自分が思っているデータベースに接続していません。
  • 自分が思っているSQL Serverインスタンスに接続していません。

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


4
+1 SQLプロファイラーを使用して、これらのタイプの問題を追跡します。他のアプリケーションから動的SQLを処理するときはいつでも、クエリをトレースでキャプチャし、それをコピーして新しいクエリウィンドウに貼り付け、[実行]をクリックして何が問題かを調べます。これにより、上記のように正しいインスタンスとdbに接続していることも検証されます。
ブライアン2011

2
...少しオフトピックがありますが、パフォーマンス上の問題を再現するためにプロファイラを使用している場合は、すべての設定オプションを含めることを忘れないでください、本当にクエリーを複製、特にARITHABORTには、(それが計画をキャッシュされています)
Nick.McDermaid

最初にCtrl + Shift + Rを使用して、キャッシュをリロードします。最悪の場合、数秒しか無駄になりません。
radbyx

267

Ctrl+ Shift+ Rを押すだけで表示されます...

SQL Server Management Studioでは、Ctrl + Shift + Rはローカルキャッシュを更新します。


なぜそうすることが役立つと思いますか?
友好的な2014

7
SQL Server Management Studioでは、Ctrl + Shift + RはIntellisenseキャッシュを更新します。これにより、追加した列が無効であるとManagement Studioが文句を言うのを止めましたが、それは問題でした(コードからこれらの新しい列にアクセスするとき、元のポスターのようにまだ問題があります)。
Giles、2014年

2
Add-Migration、次にデータベースの更新のたびに、これを実行する必要があるようです。それ以外の場合、MS SQL Serverでは無効な列名であることがわかります。動作します!どうもありがとう。
BriOnH 2015

1
テーブルやそのようなものを作成するたびに、これを行う必要があるようです。
Sonny Childs、

1
これは通常、奇妙なことが発生した場合の解決策です。ただし、この場合、問題は解決しませんでした。ただし、SQL Studioを再起動するとうまくいきました。
Dan Mehlqvist

9

これをトランザクション内で実行し、SQLステートメントがテーブルを削除または変更する前にSQLステートメントを実行すると、このメッセージも表示されます。


1
+1。新しい列を追加してテーブルを変更したところ、新しい列を参照する次のステートメントでこのエラーが発生しました。テーブルの変更が1つになるまでステートメントを実行し、残りを別のステートメントで実行することで、これを克服しました。最高のソリューションではありませんが、ブロックを解除しました。:)
Prasad Korhale

3

最終的にMicrosoft SQL Server Management Studioをシャットダウンして再起動しました。そしてそれは私のためにそれを修正しました。しかし、他の場合には、新しいクエリウィンドウを開始するだけで十分でした。


2

列と同じ名前の変数を使用している場合、 '@'変数マーカーを忘れた可能性があります。INSERTステートメントでは、列として検出されます。


2

まったく同じ問題があった。同じコードの別の部分でさらに使用される一時テーブルのエイリアス列の名前を変更しました。何らかの理由で、これはSQL Server Management Studioによってキャプチャされず、無効な列名について不満がありました。

私がしたことは、新しいクエリを作成し、SQLコードを古いクエリからこの新しいクエリにコピーアンドペーストして、もう一度実行することです。これにより、環境が正しく更新されたようです。


1

私の場合、Microsoft SQL Sever Management Studioを再起動しましたが、これでうまくいきました。



0

私の場合、問題は奇妙なキャッシュの問題だったようです。上記の解決策は機能しませんでした。

コードが正常に機能していて、テーブルの1つに列を追加し、「無効な列名」エラーが発生し、上記の解決策が機能しない場合は、これを試してください。最初に、変更されたコードを作成するためのコードのセクションのみを実行します。テーブルを作成し、コード全体を実行します。


0

これはグーグルでの「無効な列名sql」の最上位の結果であり、私はこの回答をここに表示しなかったため、この回答を含めます。私の場合、Entity Framework C#コードの.HasForeignKeyステートメントで間違ったIDを使用したため、無効な列名Id1を取得していました。.HasOne()オブジェクトのIDと一致するように変更すると、エラーは発生しなくなりました。


0

テーブル値を使用してスカラー関数を実行するとこのエラーが発生しましたが、スカラー関数RETURN句のSelectステートメントに「FROMテーブル」の部分がありません。:facepalms:


0

また、ConnectionStringを変更するのを忘れて、ローカルで行っている変更を認識していないテーブルに質問した場合にも発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.