«Не удалось найти хранимую процедуру», хотя хранимая процедура была создана в 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 Management Studio.

Я создал хранимую процедуру testtable_pricesmallerследующим образом

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

и могут просматривать хранимые процедуры в Object ExplorerMicrosoft 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

Чего не хватает?


Вы убедились, что ваш оператор execute выполняется в контексте базы данных "testbase"? Вы можете попытаться добавить оператор USE или полностью указать имя объекта.
Шон Мелтон

Да, я добавил USEзаявление, но оно дает мне ошибку.
Джек

Мне пришлось явно определить имя базы данных в моем операторе execute: EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk,

Ответы:



7

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

В следующий раз, когда вы добавите хранимую процедуру, попробуйте запустить опцию выполнения правой кнопкой мыши из проводника объектов, введите параметры и посмотрите, будет ли она запущена. Если он не запускается, то я не уверен, в чем ваша проблема. Если он работает, то это может быть что-то простое, например, SQL пытается выполнить запрос из неверной базы данных.


4

Наконец-то я знаю, почему сообщение появляется в MS SQL Server Management Studio.

Для MS SQL Server Management Studio требуется перезапустить его после создания в нем хранимой процедуры.

После перезапуска MS SQL Server Management Studio такой ошибки больше нет.

(Странно, значит ли это, что каждый раз, когда я создаю хранимую процедуру, мне приходится ее перезапускать?)


12
Вы не должны перезапускать его.
Шон Мелтон

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

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

@ Шарк, Интересно! Буду признателен, если кто-нибудь сможет мне объяснить, почему мои SSMS ведут себя так, что я нахожу это довольно странным.
Джек

6
Для дальнейшего использования: Ctrl-Shift-R обновит локальный кэш для intellisense.
Адам Шарп

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 с использованием общего источника данных. В этом общем источнике данных не указана база данных по умолчанию (параметр Default Catalog =), и я не смог добавить ее в строку подключения, потому что у меня нет пароля (и когда вы что-то меняете в источнике данных SSRS, это имеет тенденцию чтобы вы хотели повторно ввести пароль).

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

При запуске вещей из SSMS, имейте в виду, что панель Object Explorer - это одно соединение, а у любого редактора - совершенно другое соединение. Таким образом, вы можете видеть объекты для 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 'Agent XPs'

НТН

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.