2012-02-23 39 views
9

Tôi mới dùng SQL Server và đã tạo thủ tục lưu trữ đầu tiên của mình. Nó thực hiện tốt và tôi có thể xác định vị trí nó dưới 'Khả năng lập trình', 'Thủ tục lưu trữ' vì vậy tôi bật mở một truy vấn mới và gõ vào lệnh sau:Không thể tìm thấy thủ tục được lưu trữ, tuy nhiên có thể thực hiện nó

use name_of_database 
exec name_of_stored_procedure 'value' 

Tuy nhiên trước khi thực hiện các thủ tục lưu trữ, tên của các lưu trữ thủ tục được gạch dưới màu đỏ lưu ý nó không thể được tìm thấy, vì vậy tôi chạy truy vấn:

select * from INFORMATION_SCHEMA.ROUTINES where ROUTINE_NAME = 'name_of_stored_procedure' 

Nada. Nó không trả lại gì cả.

Tuy nhiên, nếu tôi tiếp tục và thực hiện quy trình được lưu trữ, nó hoạt động tốt.

Tôi đang làm gì sai?

+0

Nếu truy vấn 'INFORMATION_SCHEMA' không trả về gì thì tôi không nghĩ rằng bộ đệm IntelliSense là vấn đề của bạn (hoặc ít nhất không phải vấn đề duy nhất của bạn). Có vẻ như bạn không ở trong bối cảnh của cơ sở dữ liệu phù hợp. –

Trả lời

23

Đối với SSMS, bạn chỉ cần xóa bộ nhớ cache Intellisense (Ctrl + Shift + R). Sau đó, dòng nguệch ngoạc màu đỏ sẽ biến mất và Intellisense sẽ giúp bạn với điều đó.

Nếu bạn có thể xem Proc được lưu trữ trong Programmability -> Stored Procedures trong đối tượng thám hiểm của bạn, sau đó bạn sẽ có thể xem nó thông qua truy vấn select * from information_schema.routines ... của bạn. Kiểm tra bối cảnh cơ sở dữ liệu của bạn, cũng như phần còn lại của truy vấn. Đưa ra mệnh đề where và xem qua toàn bộ tập kết quả.

+0

Tuyệt vời. Tiếng Anh> Tiếng Việt. Tần suất SQL Server Management Studio xóa bộ nhớ cache của nó mà không cần phải nhập (CTRL + Shift + R)? – PeanutsMonkey

+0

@PeanutsMonkey Câu hỏi hay. Tôi không biết câu trả lời cho điều đó. Không có tùy chọn để thiết lập nó trong SSMS (mà tôi biết). Nó sẽ trở thành một thói quen để chỉ cần nhấn tổ hợp phím cần thiết. Không làm phiền cá nhân tôi. –

+0

Cảm ơn anh bạn. Tôi đang ngồi đây nghĩ tôi đang làm cái quái gì. – PeanutsMonkey

0

tôi đoán là bạn chỉ có thể chạy các truy vấn thứ 2 chống lại một cơ sở dữ liệu khác nhau, có lẽ là bậc thầy, hãy thử:

use 'name_of_database' 
select * from INFORMATION_SCHEMA.ROUTINES where ROUTINE_NAME = 'name_of_stored_procedure' 

và sau đó bạn sẽ có thể nhìn thấy nó

+0

Tôi đã nghi ngờ rằng tuy nhiên và đã chạy lệnh tương tự như bạn đề xuất tuy nhiên nó sẽ không trả về gì cả. – PeanutsMonkey

+0

Điều đó thật thú vị, nó sẽ là một lỗi đánh máy của tên trong mệnh đề where? –

+0

Không. Như Shark đã chỉ ra, tất cả những gì tôi cần làm là xóa bộ nhớ cache. – PeanutsMonkey

2

Có thể rằng thủ tục của bạn nằm trong một lược đồ khác với dbo? Bạn nên luôn chỉ định lược đồ khi tạo và tham chiếu các đối tượng. Có một số lý do as described here. Về cơ bản, khi bạn không chỉ định lược đồ, bạn có thể có tất cả các loại hành vi khó hiểu tùy thuộc vào lược đồ mặc định của người dùng đang tạo hoặc gọi thủ tục.

Khi kiểm tra sự tồn tại của các đối tượng, bạn cũng nên tính đến lược đồ.

Ngoài ra, bạn nên kiểm tra các thủ tục trong sys.procedures. Một số thông tin cơ bản về số coding consistently here vì bạn không thể luôn nhận được thông tin bạn đang theo dõi từ INFORMATION_SCHEMA.

2

tôi đã cùng một vấn đề và tôi cố định nó bằng cách đơn giản sử dụng dấu ngoặc vuông

EXEC [dbo].[procedureName] 

Hy vọng nó sẽ giúp người sau :)

+1

Đây là giải pháp duy nhất có hiệu quả đối với tôi. Tôi đã đóng và mở Management Studio nhưng nó không hoạt động cho đến khi tôi thêm các dấu ngoặc vuông. – sch4v4

1

Trong trường hợp của tôi, tôi giải quyết vấn đề theo cách này SIMPLY:

  1. Bất cứ khi nào tôi tạo quy trình, tôi chỉ thực hiện quy trình trên MSSQL Server Studio một lần. Vì vậy, tôi đã nhận được các thủ tục được tạo ra với lược đồ trong db_name=>Programmibility=>Stored Procedure.
  2. Cuối cùng tôi gọi nó từ mã C# của tôi. Và đã được giải quyết !!!
Các vấn đề liên quan