2011-08-31 35 views
72

Tôi đã gặp phải một chút bế tắc. Tôi có một truy vấn được tạo ra bởi một số mã C#. Truy vấn hoạt động tốt trong Microsoft SQL Server Management Studio khi chạy trên cùng cơ sở dữ liệu.Báo cáo Máy chủ SQL 'Tên cột không hợp lệ', nhưng cột có mặt và truy vấn hoạt động thông qua studio quản lý

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 lỗi tương tự về cột không hợp lệ và ngoại lệ được ném. 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. Đây là cột ngày có tên là Incident_Begin_Time_ts.

Một ví dụ thất bại là:

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

truy vấn khác như Select MAX(Incident_Being_Time_ts); cũng thất bại khi chạy trong mã vì nó nghĩ rằng cột là mất tích.

Bất kỳ ý tưởng nào?

+0

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

+1

Bạn có chắc là bạn đang xử lý cùng một cơ sở dữ liệu trong mã của mình với tư cách là một trong Management Studio? –

+1

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ố truy vấn giống hệt 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 ** _ Time_ts' và một lần 'Sự cố _ ** Là ** _ Time_ts'. –

Trả lời

49

Tôi nghi ngờ rằng bạn có hai bảng có cùng tên. Một được sở hữu bởi 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 (giống như userid.PerfDiag).

Khi bạn có tham chiếu không đủ tiêu chuẩn cho đối tượng lược đồ (chẳng hạn như bảng) — không đủ điều kiện theo tên lược đồ —, tham chiếu đối tượng phải được giải quyết. Độ phân giải tên xảy ra bằng cách tìm kiếm theo trình tự sau đây 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 phân giải thành kết quả trùng khớp đầu tiên:

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

Tham chiếu không đủ tiêu chuẩn được ràng buộc với kết quả khớp đầu tiên trong chuỗi ở trên.

Là một vị tướng đề nghị thực hành, ta nên luôn đủ điều kiện tham chiếu đến đối tượng schema, vì lý do hiệu suất:

  • Một tài liệu tham khảo không đủ tiêu chuẩn có thể làm mất hiệu lực một kế hoạch thực hiện lưu trữ cho các thủ tục lưu trữ hoặc truy vấn, kể từ khi giản đồ mà tham chiếu bị ràng buộc có thể thay đổi tùy thuộc vào thông tin đăng nhập thực thi thủ tục hoặc truy vấn được lưu trữ. Điều này dẫn đến biên dịch lại các truy vấn/thủ tục lưu trữ, một hiệu suất hit. Việc biên dịch lại làm cho các khóa biên dịch được lấy ra, ngăn chặn những người khác truy cập (các) tài nguyên cần thiết.

  • Độ phân giải tên làm chậm thực thi truy vấn vì hai đầu dò phải được thực hiện để giải quyết cho phiên bản có khả năng 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 đầu 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ủa tên và kiểu được chỉ định.

[Edited để lưu ý thêm]

Các khả năng khác là (không theo thứ tự đặc biệt):

  • You are not connected đến cơ sở dữ liệu bạn nghĩ rằng bạn đang có.
  • Bạn không được kết nối với cá thể SQL Server mà bạn nghĩ là bạn đang sử dụng.

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õ tên cá thể SQL Server và tên cơ sở dữ liệu.

+4

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

+2

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

6

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 giảm/thay đổi bảng, bạn cũng có thể nhận được thông báo này.

158

Chỉ cần nhấn tổ hợp phím Ctrl + phím Shift +R và xem ...

Trong SQL Server Management Studio, Ctrl+Shift+R refreshes the local cache.

+0

Tại sao bạn nghĩ Sẽ hữu ích? – Amicable

+5

Trong SQL Server Management Studio, Ctrl + Shift + R làm mới bộ đệm ẩn 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ĩ đó là một cá trích đỏ (tôi vẫn gặp vấn đề, như poster gốc khi truy cập các cột mới này từ mã). – Giles

+1

Dường như mỗi lần 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 nhận được rằng đó là một tên cột không hợp lệ trong MS SQL Server. Công trinh! Cảm ơn rất nhiều. – BriOnH

2

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

0

Chỉ có cùng một vấn đề. Tôi đổi tên một số cột bí danh trong một 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ột mã. Đối với một số lý do, điều này đã không bị bắt bởi SQL Server Management Studio và nó phàn nàn về tên cột không hợp lệ.

Điều tôi chỉ làm là tạo truy vấn mới, sao chép dán mã SQL từ truy vấn cũ vào 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.

Các vấn đề liên quan