"Не вдалося знайти збережену процедуру", навіть якщо збережена процедура була створена в MS SQL Server Management Studio


21

Я створив таблицю testtableвсередині бази даних, testbaseяка має таку структуру:

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

який я використовував Microsoft SQL Server 2008 Studio Studio.

Я створив збережену процедуру testtable_pricesmallerнаступним чином

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

і можуть переглядати збережені процедури Object Explorerв Microsoft Studio SQL Server Management Studio. (Він вказаний у наступній структурі дерева Object Explorer)

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

Мені здається дуже дивним, коли я отримую таку помилку:

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

коли я виконую такий оператор SQL:

execute dbo.testtable_pricesmaller 50

Що може бути відсутнім?


Ви переконалися, що ваш оператор виконання працює в контексті бази даних "testbase"? Ви можете спробувати додати оператор USE або повністю кваліфікувати ім'я об'єкта.
Шон Мелтон

Так, я додав USEзаяву, але це дає мені помилку.
Джек

Мені довелося чітко визначити ім’я бази даних у моєму операторі виконання: EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk

Відповіді:



7

Вам не доведеться перезавантажувати базу даних після додавання нової збереженої процедури, хоча вам потрібно буде оновити провідник об’єктів, щоб побачити його там.

Наступного разу, коли ви додасте збережену процедуру, спробуйте запустити опцію виконання правою кнопкою миші від провідника об’єктів і введіть ваші параметри і подивіться, чи працює вона. Якщо вона не працює, то я не впевнений, у чому полягає ваша проблема. Якщо він запустився, то це може бути щось просте, як SQL намагається запитувати з неправильної бази даних.


4

Нарешті я знаю, чому повідомлення з’являється у студії управління MS SQL Server.

Студія управління MS SQL Server вимагає перезапустити її після створення збереженої в ній процедури.

Після перезапуску MS SQL Server Management Studio більше немає такої помилки.

(Дивно, чи це означає, що кожного разу, коли я створюю збережену процедуру, я повинен її перезапустити?)


12
Вам не доведеться її перезавантажувати.
Шон Мелтон

1
@ShawnMelton Я маю на увазі, що я закриваю студію управління MS SQL Server і знову відкриваю студію управління MS SQL Server. Мені просто здається досить дивним, що мені потрібно закрити, а потім знову відкрити його. Чи є якась конфігурація MS SQL Server Management Studio (SSMS), яка мені може бути відсутньою, внаслідок чого SSMS не зможе відобразити, що збережена процедура вже створена?
Джек

5
IntelliSense - це лише частина, що відстає від того, що ви зробили. Виконання оператора exec повинно діяти без перезавантаження SSMS. Є ще щось, що сприяло тому, що це не працює. Я згоден з @ShawnMelton.
Томас Стрінгер

@Shark, Цікаво! Буду вдячний, якщо хтось може мені пояснити, чому мої SSMS поводяться так, що я вважаю це досить дивним.
Джек

6
Для подальшої довідки: Ctrl-Shift-R оновить локальний кеш для інтелігенції.
Адам Шарп

3

Ваша команда створення повинна бути

create procedure dbo.testtable_pricesmaller
    @pricelimit money

ви відсутній dbo.перед назвою процедури. Щоразу, коли ви створюєте процедуру, добре застосовувати чітко визначати користувача / схему з назвою процедури, тобто ім'я процедури повинно мати повноцінні підписи.

Я сподіваюся, що це вам допоможе.


3

У системі SQL Server 2008 під час входу в обліковий запис Windows, якщо у вас немає рівня безпеки SYSADMIN, під час створення об’єкта без явного введення схеми він може / створить його під дією [DOMAIN \ username]. [ObjectName ] замість [dbo]. [ObjectName] (я думаю, це було виправлено у SQL Server 2012, я думаю).

У мене ця проблема траплялася зі мною, коли я знижував рівень безпеки користувача, і одна з процедур, яку він виконував, скидала та відтворювала таблиці без схеми, тому решта процедури припинялася, оскільки він не міг знову отримати доступ до об'єкта . Виявляється, таблиці створені під ім'ям його домену.

Ось публікація Microsoft про таку поведінку:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (шукайте розділ "Неявна схема та створення користувачів")

Таблиця не створюється за схемою dbo

SQL 2008 R2 створює користувача / схему, коли користувач Windows створює таблиці

Отже, коротше кажучи, у вас, мабуть, або є проблема з базою даних (ви створюєте свою таблицю в базі даних, але намагаєтесь отримати доступ до неї з іншої), або у вас є проблема, як я щойно описав.


2

Я знаю, що це старе; Я натрапив на це питання, коли шукав рішення цієї самої проблеми, і я публікую цю відповідь, сподіваючись, що вона допоможе іншим, хто теж знайде це питання.

У моєму випадку я отримав повідомлення про помилку під час запуску звіту SSRS із використанням спільного джерела даних. Це спільне джерело даних не вказало базу даних за замовчуванням (параметр Каталог за замовчуванням = параметр), і я не зміг додати його до рядка з'єднання, оскільки у мене немає пароля (і коли ви щось зміните в джерелі даних SSRS, це має тенденцію бажати, щоб ви знову ввели пароль).

Щоб вирішити це, я змінив базу даних за замовчуванням для входу в екземпляр SQL Server з головного на базу даних, що містить збережену процедуру, яку хотів виконати звіт.

Запускаючи речі з SSMS, пам’ятайте, що панель «Провідник об’єктів» - це одне з'єднання, тоді як незалежний редактор - це зовсім інше з'єднання. Таким чином, ви можете бачити об’єкти для SQL01 в Object Explorer, але код, який ви запускаєте в редакторі, буде працювати проти SQL02 - я кілька разів стикався з цією проблемою протягом багатьох років, після багатьох переслідувань і "Чому не це працює? " зрозумів мою помилку. Щодо редактора, подивіться в правому нижньому куті, щоб побачити, до якого екземпляра та бази даних ви підключені.


1

TL; DR: У вас може бути збережена процедура, яка викликає іншу збережену процедуру, яка не існує.


У мене була ця проблема і знайшли виправлення. Ось що сталося Я створив одну збережену процедуру:

create procedure dbo.MyProc
    ...

Потім я створив ще одну збережену процедуру, яка виконала першу

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

Через деякий час я перейменувався dbo.MyProcв dbo.MyProc2. Після перейменування, коли я намагався зателефонувати dbo.MyProcCaller, я отримаю це повідомлення про помилку:

exec dbo.MyProcCaller

Не вдалося знайти збережену процедуру 'RLM.usp_getSecondaryRestrictedLists_Old'.

Моє рішення полягало в тому, щоб змінити свою другу збережену процедуру для використання нового імені:

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

Ось простий спосіб перевірити, чи є у вас проблема. Клацніть, щоб змінити текст збереженої процедури, а потім виконати цей текст. Якщо ви отримаєте таке попередження, вам потрібно перейменувати збережену процедуру:

Модуль 'dbo.MyProcCaller' залежить від відсутнього об'єкта 'dbo.MyProc'. Модуль все одно буде створений; однак він не може успішно працювати, поки об'єкт не існує.

(1 ряд (и) зачеплений)


0

Це питання кілька років, але я просто хочу створити ще одну можливість для кожного, як я, хто знайшов його пізніше.

Я запустив цю команду: EXEC SP_CONFIGURE "Агент XP"

І описано помилку: Msg 2812, рівень 16, стан 62, рядок 1 Не вдалося знайти збережену процедуру 'SP_CONFIGURE'.

Але тоді я згадав, що цей сервер налаштований на чутливість до регістру. Отже, ця команда спрацювала чудово: EXEC sp_configure "Агент XP"

HTH

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.