"Không thể tìm thấy quy trình được lưu trữ" mặc dù quy trình được lưu trữ đã được tạo trong MS SQL Server Management Studio


21

Tôi đã tạo một bảng testtablebên trong cơ sở dữ liệu testbasecó cấu trúc sau:

product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)

mà tôi đã sử dụng Microsoft SQL Server 2008 Management Studio.

Tôi đã tạo một thủ tục được lưu trữ testtable_pricesmallernhư sau

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go

và có thể xem Các thủ tục được lưu trữ trên Object ExplorerMicrosoft SQL Server Management Studio. (Nó được liệt kê trong cấu trúc cây sau đây của Object Explorer)

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller

Tôi thấy rất lạ khi nhận được lỗi sau:

Could not find the stored procedure 'dbo.testtable_pricesmaller'.

khi tôi thực hiện câu lệnh SQL sau:

execute dbo.testtable_pricesmaller 50

Nó có thể thiếu gì?


Bạn có chắc chắn rằng câu lệnh thực thi của bạn đang chạy trong bối cảnh cơ sở dữ liệu "testbase" không? Bạn có thể thử thêm một tuyên bố USE hoặc đủ điều kiện tên đối tượng.
Shawn Melton

Vâng, tôi đã thêm USEcâu lệnh nhưng nó cho tôi lỗi.
Jack

Tôi đã phải xác định rõ ràng tên cơ sở dữ liệu trong câu lệnh thực thi của mình: EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk

Câu trả lời:



7

Bạn không cần phải khởi động lại cơ sở dữ liệu sau khi thêm một thủ tục được lưu trữ mới, mặc dù bạn sẽ cần làm mới trình thám hiểm đối tượng của mình để xem nó ở đó.

Lần tới khi bạn thêm một thủ tục được lưu trữ, hãy thử chạy tùy chọn thực thi nhấp chuột phải từ trình thám hiểm đối tượng và nhập tham số của bạn và xem nếu nó chạy. Nếu nó không chạy thì tôi không chắc vấn đề của bạn là gì. Nếu nó chạy thì nó có thể là một cái gì đó đơn giản như SQL đang cố truy vấn từ cơ sở dữ liệu sai.


4

Cuối cùng tôi biết tại sao thông báo xuất hiện trong MS SQL Server Management Studio.

Studio quản lý máy chủ MS SQL yêu cầu một người khởi động lại nó sau khi tạo một thủ tục được lưu trữ trong đó.

Sau khi khởi động lại MS SQL Server Management Studio, không còn lỗi như vậy nữa.

(Lạ thật, điều đó có nghĩa là mỗi lần tôi tạo một thủ tục được lưu trữ, tôi phải khởi động lại nó?)


12
Bạn không cần phải khởi động lại nó.
Shawn Melton

1
@ShawnMelton Ý tôi là tôi đóng MS SQL Server Management Studio và mở lại MS SQL Server Management Studio. Tôi chỉ thấy khá lạ là tôi phải đóng và sau đó mở lại. Có bất kỳ cấu hình nào của MS SQL Server Management Studio (SSMS) mà tôi có thể bị thiếu, dẫn đến SSMS không thể phản ánh rằng Thủ tục lưu trữ đã được tạo không?
Jack

5
IntelliSense là phần chậm trễ duy nhất của những gì bạn đã làm. Thực thi câu lệnh exec nên đã hoạt động mà không cần khởi động lại SSMS. Có một cái gì đó khác góp phần vào nó không hoạt động. Tôi đồng ý với @ShawnMelton.
Thomas Stringer

@Shark, Thú vị! Tôi sẽ đánh giá cao nếu có ai có thể giải thích cho tôi rằng tại sao SSMS của tôi lại hoạt động theo cách mà tôi thấy nó khá lạ.
Jack

6
Để tham khảo trong tương lai: Ctrl-Shift-R sẽ làm mới bộ đệm cục bộ, cho intellisense.
Adam Scharp

3

Lệnh tạo của bạn phải là

create procedure dbo.testtable_pricesmaller
    @pricelimit money

bạn bị thiếu dbo.trước tên thủ tục. Bất cứ khi nào bạn tạo một thủ tục, cách tốt nhất là xác định rõ ràng người dùng / lược đồ với tên của thủ tục tức là tên thủ tục phải có chữ ký đủ điều kiện.

Tôi hy vọng điều này sẽ giúp bạn.


3

Trong SQL Server 2008, khi đăng nhập bằng tài khoản Windows, nếu bạn không có mức bảo mật SYSADMIN, khi bạn tạo một đối tượng mà không chỉ định rõ ràng lược đồ, nó có thể / sẽ tạo nó trong [DOMAIN \ username]. [ObjectName ] thay vì [dbo]. [ObjectName] (tôi đã sửa nó trong SQL Server 2012).

Tôi đã gặp phải sự cố này khi tôi giảm mức bảo mật của người dùng và một trong những quy trình anh ta đang thực hiện là bỏ và tạo lại các bảng mà không có lược đồ, vì vậy phần còn lại của quy trình đã bị sập vì không thể truy cập lại đối tượng . Hóa ra các bảng bây giờ đã được tạo dưới tên người dùng tên miền của mình.

Đây là bài viết của Microsoft về hành vi này:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (tìm phần "Lược đồ ẩn và tạo người dùng")

Bảng không được tạo trong lược đồ dbo

SQL 2008 R2 tạo người dùng / lược đồ khi người dùng Windows tạo bảng

Vì vậy, trong ngắn hạn, bạn có thể có một vấn đề cơ sở dữ liệu (bạn tạo bảng của mình trong cơ sở dữ liệu nhưng cố gắng truy cập nó từ một cái khác) hoặc bạn có vấn đề như tôi vừa mô tả.


2

Tôi biết điều này là cũ; Tôi đã bắt gặp câu hỏi này trong khi tôi đang tìm kiếm một giải pháp cho vấn đề tương tự này và tôi đang đăng câu trả lời này với hy vọng nó sẽ giúp những người khác cũng tìm thấy câu hỏi này.

Trong trường hợp của tôi, tôi đã nhận được thông báo lỗi trong khi chạy báo cáo SSRS bằng nguồn dữ liệu được chia sẻ. Nguồn dữ liệu được chia sẻ này không chỉ định cơ sở dữ liệu mặc định (Tham số mặc định = tham số) và tôi không thể thêm nó vào chuỗi kết nối vì tôi không có mật khẩu (và khi bạn thay đổi thứ gì đó trong nguồn dữ liệu SSRS thì nó có xu hướng muốn bạn nhập lại mật khẩu).

Để giải quyết vấn đề này, tôi đã thay đổi cơ sở dữ liệu mặc định để đăng nhập trong phiên bản SQL Server từ chủ sang cơ sở dữ liệu chứa quy trình được lưu trữ mà báo cáo muốn thực thi.

Khi chạy mọi thứ từ SSMS, hãy nhớ rằng khung Object Explorer là một kết nối trong khi bất kỳ trình soạn thảo nào bạn có là một kết nối hoàn toàn khác. Vì vậy, bạn có thể thấy các đối tượng cho SQL01 trong Object Explorer, nhưng mã bạn đang chạy trong trình soạn thảo sẽ chạy với SQL02 - Tôi đã gặp vấn đề này một vài lần trong nhiều năm và sau nhiều lần chửi rủa và "Tại sao sẽ không nó hoạt động? " nhận ra sai lầm của tôi. Đối với trình chỉnh sửa, hãy nhìn ở góc dưới bên phải để xem trường hợp và cơ sở dữ liệu nào bạn được kết nối.


1

TL; DR: Bạn có thể có một thủ tục được lưu trữ đang gọi một thủ tục được lưu trữ khác không tồn tại.


Tôi đã có vấn đề này và tìm thấy một sửa chữa. Đây là những gì đã xảy ra. Tôi đã tạo một thủ tục được lưu trữ:

create procedure dbo.MyProc
    ...

Sau đó tôi đã tạo một thủ tục lưu trữ khác thực hiện quy trình đầu tiên

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc
    ...

Một thời gian sau, tôi đổi tên dbo.MyProcđể dbo.MyProc2. Sau khi đổi tên, khi tôi cố gọi dbo.MyProcCaller, tôi nhận được thông báo lỗi này:

exec dbo.MyProcCaller

Không thể tìm thấy thủ tục được lưu trữ 'RLM.usp_getSecondaryRestrictedLists_Old'.

Giải pháp của tôi là thay đổi thủ tục lưu trữ thứ hai của tôi để sử dụng tên mới:

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc2
    ...

Đây là một cách đơn giản để kiểm tra nếu bạn có vấn đề này. Nhấn vào đây để sửa đổi văn bản của thủ tục được lưu trữ và sau đó thực hiện văn bản đó. Nếu bạn nhận được một cảnh báo như thế này, bạn cần đổi tên thủ tục được lưu trữ của mình:

Mô-đun 'dbo.MyProcCaller' phụ thuộc vào đối tượng bị thiếu 'dbo.MyProc'. Mô-đun vẫn sẽ được tạo; tuy nhiên, nó không thể chạy thành công cho đến khi đối tượng tồn tại.

(1 hàng bị ảnh hưởng)


0

Câu hỏi này đã được vài năm tuổi, nhưng tôi chỉ muốn đưa ra một khả năng khác cho bất kỳ ai như tôi, người đã tìm thấy nó sau này.

Tôi đã chạy lệnh này: EXEC SP_CONFIGURE 'Agent XPs'

Và đã nhận được lỗi được mô tả: Msg 2812, Cấp 16, Bang 62, Dòng 1 Không thể tìm thấy quy trình được lưu trữ 'SP_CONFIGURE'.

Nhưng sau đó tôi nhớ rằng máy chủ này được thiết lập để phân biệt chữ hoa chữ thường. Vì vậy, lệnh này hoạt động tốt: EXEC sp_cool 'Agent XPs'

HTH

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.