SQL Server melaporkan 'Nama kolom tidak valid', tetapi kolom tersebut ada dan kueri berfungsi melalui studio manajemen

107

Saya sedikit menemui jalan buntu. Saya memiliki kueri yang dihasilkan oleh beberapa C#kode. Kueri berfungsi dengan baik diMicrosoft SQL Server Management Studio saat dijalankan pada database yang sama.

Namun ketika kode saya mencoba untuk menjalankan kueri yang sama, saya mendapatkan kesalahan yang sama tentang kolom yang tidak valid dan pengecualian dilemparkan. Semua kueri yang mereferensikan kolom ini gagal.

Kolom yang dimaksud baru-baru ini ditambahkan ke database. Ini adalah kolom tanggal yang disebutIncident_Begin_Time_ts .

Contoh yang gagal adalah:

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

Pertanyaan lain seperti Select MAX(Incident_Being_Time_ts); juga gagal saat dijalankan dalam kode karena dianggap kolom hilang.

Ada ide?

kidl33t
sumber
Apakah mungkin ada masalah dengan kasus? Mungkin Management Studio tidak peduli dengan kasus, sementara cara lain untuk mengakses database lebih ketat.
Oliver
1
Apakah Anda yakin Anda berurusan dengan database yang sama di kode Anda dengan yang ada di Management Studio?
rlb.usa
3
Apakah Anda yakin bahwa nama kolom yang Anda buat di C # dan nama kolom yang Anda coba tanyakan persis sama? Dalam pertanyaan Anda, Anda menulis dua kali 'Insiden _ Mulai _ Waktu_' dan sekali 'Insiden _ Menjadi _ Waktu'.
Christian Specht
1
@Oliver: sensitivitas huruf bukan per koneksi. Ini sebagai opsi server database / sql.
Nicholas Carey

Jawaban:

65

Saya menduga Anda memiliki dua tabel dengan nama yang sama. Satu dimiliki oleh skema 'dbo' ( dbo.PerfDiag), dan yang lainnya dimiliki oleh skema default akun yang digunakan untuk menyambung ke SQL Server (seperti userid.PerfDiag).

Jika Anda memiliki referensi yang tidak memenuhi syarat ke objek skema (seperti tabel) - referensi yang tidak memenuhi syarat menurut nama skema - referensi objek harus diselesaikan. Resolusi nama terjadi dengan mencari dalam urutan berikut untuk objek dari tipe yang sesuai (tabel) dengan nama yang ditentukan. Nama tersebut memutuskan untuk pertandingan pertama:

  • Di bawah skema default pengguna.
  • Di bawah skema 'dbo'.

Referensi yang tidak memenuhi syarat terikat pada kecocokan pertama dalam urutan di atas.

Sebagai praktik umum yang direkomendasikan, salah satu referensi harus selalu memenuhi syarat untuk objek skema, untuk alasan kinerja:

  • Referensi yang tidak memenuhi syarat dapat membatalkan rencana eksekusi yang di-cache untuk prosedur atau kueri yang disimpan, karena skema yang mengikat referensi dapat berubah tergantung pada kredensial yang menjalankan prosedur atau kueri yang tersimpan. Hal ini menghasilkan kompilasi ulang kueri / prosedur tersimpan, kinerja yang terpukul. Kompilasi ulang menyebabkan kunci kompilasi dihapus, memblokir orang lain untuk mengakses sumber daya yang dibutuhkan.

  • Resolusi nama memperlambat eksekusi kueri karena dua probe harus dibuat untuk menyelesaikan kemungkinan versi objek (yang dimiliki oleh 'dbo'). Ini kasus biasa. Satu-satunya saat probe tunggal akan menyelesaikan nama adalah jika pengguna saat ini memiliki objek dengan nama dan jenis yang ditentukan.

[Diedit untuk catatan lebih lanjut]

Kemungkinan lainnya adalah (tanpa urutan tertentu):

  • Anda tidak tersambung ke database yang Anda kira.
  • Anda tidak terhubung ke contoh SQL Server yang Anda kira.

Periksa kembali string koneksi Anda dan pastikan bahwa string tersebut secara eksplisit menentukan nama instance SQL Server dan nama database.

Nicholas Carey
sumber
4
+1 Saya menggunakan sql profiler untuk melacak jenis masalah ini. Setiap kali Anda berurusan dengan sql dinamis dari aplikasi lain, tangkap kueri dengan jejak, salin & tempel ke jendela kueri baru, klik jalankan untuk mencari tahu apa yang salah. Ini juga akan memvalidasi bahwa Anda terhubung ke instance dan db yang benar seperti yang disarankan di atas.
Brian
2
... sedikit keluar dari topik tetapi jika Anda menggunakan profiler untuk mereproduksi masalah kinerja, ingatlah untuk menyertakan semua opsi yang ditetapkan , terutama ARITHABORT untuk benar-benar menduplikasi kueri (dan itu adalah paket cache)
Nick.McDermaid
Pertama coba dengan Ctrl + Shift + R, untuk memuat ulang cache. Kasus terburuk Anda hanya membuang beberapa detik.
radbyx
267

Cukup tekan Ctrl+ Shift+ Rdan lihat ...

Di SQL Server Management Studio, Ctrl + Shift + R menyegarkan cache lokal.

Mangesh
sumber
Menurut Anda mengapa melakukan itu akan membantu?
Ramah
7
Di SQL Server Management Studio, Ctrl + Shift + R menyegarkan cache Intellisense. Ini menghentikan Studio Manajemen untuk mengeluh bahwa kolom yang saya tambahkan tidak valid, tetapi saya pikir itu adalah masalah besar (saya masih memiliki masalah, seperti poster asli, saat mengakses kolom baru ini dari kode).
Giles
2
Sepertinya setiap saya Add-Migration, lalu Update Database, saya harus melakukan ini. Jika tidak, saya mendapatkan bahwa itu adalah nama kolom yang tidak valid di MS SQL Server. Bekerja! Terima kasih banyak.
BriOnH
1
Sepertinya Anda mungkin harus melakukan ini setiap kali membuat tabel atau semacamnya.
Sonny Childs
1
Ini di atas biasanya menjadi solusi saya ketika hal-hal aneh terjadi. Namun dalam kasus ini tidak menyelesaikan masalah. Restart SQL Studio melakukan triknya.
Dan Mehlqvist
9

Jika Anda menjalankan ini di dalam transaksi dan pernyataan SQL sebelum ini menjatuhkan / mengubah tabel, Anda juga bisa mendapatkan pesan ini.

Stagg
sumber
1
+1. Saya mengubah tabel dengan menambahkan kolom baru dan mendapatkan kesalahan ini di pernyataan berikutnya yang merujuk ke kolom baru. Saya mengatasi ini dengan mengeksekusi pernyataan sampai tabel berubah sekaligus dan kemudian sisanya di tempat lain. Bukan solusi terbaik tetapi membuat saya tidak diblokir. :)
Prasad Korhale
3

Saya akhirnya mematikan dan memulai ulang Microsoft SQL Server Management Studio; dan itu memperbaikinya untuk saya. Namun di lain waktu, memulai jendela kueri baru saja sudah cukup.

IAM_AL_X
sumber
2

Jika Anda menggunakan variabel dengan nama yang sama dengan kolom Anda, bisa jadi Anda lupa penanda variabel '@'. Dalam pernyataan INSERT itu akan dideteksi sebagai kolom.

Dévan Coetzee
sumber
2

Baru saja mengalami masalah yang sama persis. Saya mengganti nama beberapa kolom alias di tabel sementara yang selanjutnya digunakan oleh bagian lain dari kode yang sama. Untuk beberapa alasan, ini tidak direkam oleh SQL Server Management Studio dan mengeluh tentang nama kolom yang tidak valid.

Apa yang saya lakukan hanyalah membuat kueri baru, menyalin dan menempelkan kode SQL dari kueri lama ke kueri baru ini dan menjalankannya lagi. Ini sepertinya menyegarkan lingkungan dengan benar.

Pai apel
sumber
1

Dalam kasus saya, saya memulai ulang Microsoft SQL Sever Management Studio dan ini berfungsi dengan baik untuk saya.

Rexhi
sumber
0

Dalam kasus saya, saya mencoba mendapatkan nilai dari ResultSet yang salah saat menanyakan beberapa pernyataan SQL.

Deepak Kataria
sumber
0

Dalam kasus saya, tampaknya masalahnya adalah masalah cache yang aneh. Solusi di atas tidak berhasil.

Jika kode Anda berfungsi dengan baik dan Anda menambahkan kolom ke salah satu tabel Anda dan itu memberikan kesalahan 'nama kolom tidak valid', dan solusi di atas tidak berfungsi, coba ini: Pertama-tama jalankan hanya bagian kode untuk membuat yang dimodifikasi tabel dan kemudian jalankan seluruh kode.

LoMaPh
sumber
0

Termasuk jawaban ini karena ini adalah hasil teratas untuk "nama kolom tidak valid sql" di google dan saya tidak melihat jawaban ini di sini. Dalam kasus saya, saya mendapatkan Nama Kolom Tidak Valid, Id1 karena saya telah menggunakan id yang salah dalam pernyataan .HasForeignKey saya dalam kode Entity Framework C # saya. Setelah saya mengubahnya agar cocok dengan id objek .HasOne (), kesalahan itu hilang.

Daniel
sumber
0

Saya mendapatkan kesalahan ini saat menjalankan fungsi skalar menggunakan nilai tabel, tetapi pernyataan Select di klausa RETURN fungsi skalar saya kehilangan bagian "DARI tabel". : facepalms:

cdabel
sumber
0

Juga terjadi ketika Anda lupa untuk mengubah ConnectionString dan meminta tabel yang tidak tahu tentang perubahan yang Anda buat secara lokal.

Иво Недев
sumber