SQL Server báo cáo 'Tên cột không hợp lệ', nhưng cột này hiện diện và truy vấn hoạt động thông qua phòng thu quản lý


107

Tôi đã gặp một chút bế tắc. Tôi có một truy vấn được tạo bởi một số C#mã. Truy vấn hoạt động tốt Microsoft SQL Server Management Studiokhi chạy trên cùng một cơ sở dữ liệu.

Tuy nhiên, khi mã của tôi cố gắng chạy cùng một truy vấn, tôi nhận được cùng một lỗi về cột không hợp lệ và một ngoại lệ được đưa ra. Tất cả các truy vấn tham chiếu đến cột này đều không thành công.

Cột được đề cập gần đây đã được thêm vào cơ sở dữ liệu. Nó là một cột ngày được gọi là Incident_Begin_Time_ts.

Một ví dụ không thành công là:

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

Các truy vấn khác như Select MAX(Incident_Being_Time_ts);cũng không thành công khi chạy trong mã vì nó cho rằng cột bị thiếu.

Bất kỳ ý tưởng?


Nó là một vấn đề với trường hợp có thể? Có lẽ Management Studio không quan tâm đến trường hợp, trong khi các cách truy cập cơ sở dữ liệu khác nghiêm ngặt hơn.
Oliver,

1
Bạn có chắc chắn đang xử lý cùng một cơ sở dữ liệu trong mã của mình với cơ sở dữ liệu trong Management Studio không?
rlb.usa

3
Bạn có chắc chắn rằng tên cột bạn đã tạo trong C # và tên cột bạn cố gắng truy vấn là hoàn toàn giống nhau không? Trong câu hỏi của bạn, bạn đang viết hai lần "Sự cố _ Bắt đầu _ Thời gian_t" và một lần "Sự cố _ Đang _ Thời gian_t".
Christian Specht,

1
@Oliver: không phân biệt chữ hoa chữ thường cho mỗi kết nối. Nó như một tùy chọn máy chủ cơ sở dữ liệu / sql.
Nicholas Carey,

Câu trả lời:


65

Tôi nghi ngờ rằng bạn có hai bảng có cùng tên. Một cái thuộc sở hữu của lược đồ 'dbo' ( dbo.PerfDiag) và cái kia thuộc sở hữu của lược đồ mặc định của tài khoản được sử dụng để kết nối với SQL Server (tương tự như vậy userid.PerfDiag).

Khi bạn có một tham chiếu không đủ điều kiện đến một đối tượng lược đồ (chẳng hạn như bảng) - một tham chiếu không đủ điều kiện theo tên lược đồ - thì tham chiếu đối tượng phải được giải quyết. Việc phân giải tên xảy ra bằng cách tìm kiếm trong chuỗi sau cho một đối tượng thuộc loại thích hợp (bảng) với tên được chỉ định. Tên giải quyết cho trận đấu đầu tiên:

  • Theo lược đồ mặc định của người dùng.
  • Dưới lược đồ 'dbo'.

Tham chiếu không đủ điều kiện được liên kết với trận đấu đầu tiên trong chuỗi trên.

Như một phương pháp chung được khuyến nghị, một người phải luôn đủ điều kiện tham chiếu đến các đối tượng lược đồ, vì lý do hiệu suất:

  • Tham chiếu không đủ điều kiện có thể làm mất hiệu lực kế hoạch thực thi được lưu trong bộ nhớ cache cho thủ tục hoặc truy vấn được lưu trữ, vì lược đồ mà tham chiếu bị ràng buộc có thể thay đổi tùy thuộc vào thông tin xác thực thực thi thủ tục hoặc truy vấn được lưu trữ. Điều này dẫn đến việc biên dịch lại truy vấn / thủ tục được lưu trữ, một cú đánh hiệu suất. Việc biên dịch lại khiến khóa biên dịch bị loại bỏ, chặn người khác truy cập (các) tài nguyên cần thiết.

  • Việc phân giải tên làm chậm quá trình thực thi truy vấn vì phải thực hiện hai thăm dò để giải quyết phiên bản có thể có của đối tượng (thuộc sở hữu của 'dbo'). Đây là trường hợp thông thường. Lần duy nhất một thăm dò duy nhất sẽ giải quyết tên là nếu người dùng hiện tại sở hữu một đối tượng có tên và loại được chỉ định.

[Đã chỉnh sửa để ghi chú thêm]

Các khả năng khác là (không theo thứ tự cụ thể):

  • Bạn không được kết nối với cơ sở dữ liệu mà bạn nghĩ.
  • Bạn không được kết nối với phiên bản SQL Server như bạn nghĩ.

Kiểm tra kỹ các chuỗi kết nối của bạn và đảm bảo rằng chúng chỉ định rõ ràng tên phiên bản SQL Server và tên cơ sở dữ liệu.


4
+1 Tôi sử dụng hồ sơ sql để theo dõi các loại vấn đề này. Bất kỳ lúc nào bạn xử lý sql động từ các ứng dụng khác, hãy ghi lại truy vấn bằng dấu vết, sao chép và dán nó vào cửa sổ truy vấn mới, nhấp vào thực thi để tìm ra điều gì sai. Điều này cũng sẽ xác nhận rằng bạn đang kết nối với phiên bản và db chính xác như đã đề xuất ở trên.
brian,

2
... hơi lạc đề nhưng nếu bạn đang sử dụng hồ sơ để tái tạo các vấn đề về hiệu suất, hãy nhớ bao gồm tất cả các tùy chọn đã đặt , đặc biệt là ARITHABORT để thực sự sao chép truy vấn (và đó là kế hoạch được lưu trong bộ nhớ cache)
Nick.McDermaid

Trước tiên, hãy thử với Ctrl + Shift + R để tải lại bộ nhớ cache. Trường hợp tệ nhất bạn chỉ lãng phí vài giây.
radbyx

267

Chỉ cần nhấn Ctrl+ Shift+ Rvà xem ...

Trong SQL Server Management Studio, Ctrl + Shift + R làm mới bộ đệm cục bộ.


Bạn nghĩ tại sao làm điều đó sẽ hữu ích?
Amicable

7
Trong SQL Server Management Studio, Ctrl + Shift + R làm mới bộ đệm Intellisense. Điều này đã ngăn Management Studio phàn nàn rằng các cột tôi đã thêm không hợp lệ, nhưng tôi nghĩ rằng đó là một con cá trích đỏ (tôi vẫn gặp sự cố, giống như người đăng ban đầu, khi truy cập các cột mới này từ mã).
Giles

2
Có vẻ như bất cứ khi nào tôi Thêm di chuyển, sau đó Cập nhật Cơ sở dữ liệu, tôi phải làm điều này. Nếu không, tôi hiểu rằng đó là tên cột không hợp lệ trong MS SQL Server. Làm! Cảm ơn rất nhiều.
BriOnH

1
Có vẻ như bạn có thể phải làm điều này mỗi khi tạo bảng hoặc bất kỳ thứ gì tương tự.
Sonny Childs

1
Đây thường là giải pháp của tôi khi những điều kỳ lạ xảy ra. Tuy nhiên, trong trường hợp này nó không giải quyết được vấn đề. Tuy nhiên, khởi động lại SQL Studio đã thực hiện được thủ thuật.
Dan Mehlqvist

9

Nếu bạn đang chạy điều này bên trong một giao dịch và một câu lệnh SQL trước khi điều này làm giảm / thay đổi bảng, bạn cũng có thể nhận được thông báo này.


1
+1. Tôi đã thay đổi một bảng bằng cách thêm cột mới và gặp lỗi này trong câu lệnh tiếp theo khi tham chiếu cột mới. Tôi đã khắc phục điều này bằng cách thực hiện các câu lệnh cho đến khi thay đổi bảng trong một lần và sau đó là phần còn lại trong lần khác. Không phải là giải pháp tốt nhất nhưng đã giúp tôi mở khóa. :)
Prasad Korhale

3

Cuối cùng tôi đã tắt và khởi động lại Microsoft SQL Server Management Studio; và điều đó đã sửa nó cho tôi. Nhưng vào những lúc khác, chỉ cần bắt đầu một cửa sổ truy vấn mới là đủ.


2

Nếu bạn đang sử dụng các biến có cùng tên với cột của mình, có thể bạn đã quên dấu biến '@'. Trong một câu lệnh INSERT, nó sẽ được phát hiện là một cột.


2

Chỉ có cùng một vấn đề. Tôi đã đổi tên một số cột bí danh trong bảng tạm thời được sử dụng thêm bởi một phần khác của cùng mã. Vì một số lý do, điều này không được SQL Server Management Studio nắm bắt và nó phàn nàn về tên cột không hợp lệ.

Những gì tôi chỉ đơn giản làm là tạo một truy vấn mới, sao chép, dán mã SQL từ truy vấn cũ sang truy vấn mới này và chạy lại. Điều này dường như làm mới môi trường một cách chính xác.


1

Trong trường hợp của tôi, tôi khởi động lại Microsoft SQL Sever Management Studio và điều này hoạt động tốt đối với tôi.


0

Trong trường hợp của tôi, tôi đang cố gắng lấy giá trị từ ResultSet sai khi truy vấn nhiều câu lệnh SQL.


0

Trong trường hợp của tôi, có vẻ như vấn đề là một vấn đề bộ nhớ đệm kỳ lạ. Các giải pháp trên không hoạt động.

Nếu mã của bạn hoạt động tốt và bạn đã thêm một cột vào một trong các bảng của mình và nó gây ra lỗi 'tên cột không hợp lệ' và các giải pháp ở trên không hoạt động, hãy thử cách này: Đầu tiên chỉ chạy phần mã để tạo đã sửa đổi bảng và sau đó chạy toàn bộ mã.


0

Bao gồm câu trả lời này vì đây là kết quả hàng đầu cho "tên cột không hợp lệ sql" trên google và tôi không thấy câu trả lời này ở đây. Trong trường hợp của tôi, tôi nhận được Tên cột không hợp lệ, Id1 vì tôi đã sử dụng sai id trong câu lệnh .HasForeignKey trong mã Entity Framework C # của mình. Sau khi tôi thay đổi nó để khớp với id của đối tượng .HasOne (), lỗi đã biến mất.


0

Tôi đã gặp lỗi này khi chạy một hàm vô hướng sử dụng giá trị bảng, nhưng câu lệnh Select trong mệnh đề RETURN hàm vô hướng của tôi bị thiếu phần "TỪ bảng". : facepalms:


0

Cũng xảy ra khi bạn quên thay đổi Chuỗi kết nối và hỏi một bảng không biết về những thay đổi bạn đang thực hiện cục bộ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.