"не удалось найти хранимую процедуру"
Я поддерживаю классический веб-сайт ASP с бэкэнд SQL Server 2005. Для небольшой части новой функциональности я написал хранимую процедуру для вставки. Это единственная пользовательская хранимая процедура в базе данных.
Когда я пытаюсь вызвать хранимую процедуру из кода, я получаю следующую ошибку:
Microsoft OLE DB Provider for SQL Server error '80040e14'
Could not find stored procedure 'InsertGroup'.
/newGroup.asp, line 84
БД использует аутентификацию SQL Server. Когда я подключаюсь к серверу БД в Visual Studio с использованием того же пользователя /pw, что и в строке подключения, хранимая процедура не видна, кроме всех таблиц.
Пользователь имеет роли datareader и datawriter и явное разрешение на выполнение хранимой процедуры.
Что мне не хватает?
UPDATE: Мои извинения, администратор сервера неправильно проинформировал меня о том, что это 2000-й сервер, когда он на самом деле является сервером 2005 года (работает на Windows Server 2003 x64).
Ответы
Ответ 1
Прощай стыд:
Строка подключения указывала на живую базу данных. Сообщение об ошибке было полностью точным - хранимая процедура присутствовала только в Dev DB. Спасибо всем, кто дал отличные ответы, и мои извинения за то, что тратили ваше время.
Ответ 2
Вам может потребоваться проверить, кем является фактический владелец хранимой процедуры. Если это конкретный другой пользователь, это может быть причиной того, что вы не можете получить к нему доступ.
Ответ 3
Иногда это также может случиться, когда вы вызываете хранимую процедуру с параметрами. Например, если вы наберете что-то вроде:
set @runProc = 'dbo.StoredProcedure'
exec @runProc
Это будет работать, однако:
set @runProc = 'dbo.StoredProcedure ''foods'''
exec @runProc
Это вызовет ошибку "не удалось найти хранимую процедуру dbo.StoredProcedure" продукты ", однако это можно легко преодолеть с помощью скобок, например:
set @runProc = 'exec dbo.StoredProcedure ''foods'''
exec (@runProc)
Ответ 4
убедитесь, что имя вашей схемы находится в строке подключения?
Ответ 5
Есть две причины:
1- имя процедуры хранения
Когда вы объявляете процедуру хранилища в коде, убедитесь, что вы не выполняете ключевое слово exec или execute
например:
С#
string sqlstr="sp_getAllcustomers";// right way to declare it.
string sqlstr="execute sp_getAllCustomers";//wrong way and you will get that error message.
Из этого кода:
MSDBHelp.ExecuteNonQuery(sqlconexec, CommandType.StoredProcedure, sqlexec);
CommandType.StoreProcedure
будет искать только имя процедуры хранения, а ExecuteNonQuery
выполнит процедуру сохранения за сценой.
2- строка подключения:
Другая причина - неправильная строка подключения. Просмотрите строку подключения и убедитесь, что у вас есть соединение, особенно имя базы данных и т.д.
Ответ 6
Я имел:
ИСПОЛЬЗОВАТЬ [ неправильное место ]
ИДТИ
до
DECLARE..
Ответ 7
Не удалось найти хранимую процедуру? ---- означает, когда вы получите это. наш код, подобный этому
String sp="{call GetUnitReferenceMap}";
stmt=conn.prepareCall(sp);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
currencyMap.put(rs.getString(1).trim(), rs.getString(2).trim());
У меня есть 4 базы данных (sample1, sample2, sample3) Но stmt
будет искать местоположение master
DB по умолчанию, тогда мы получим Exception.
мы должны указать имя БД, тогда проблема разрешает::
String sp="{call sample1..GetUnitReferenceMap}";
Ответ 8
Еще одна возможность проверить. Листинг здесь, потому что это случилось со мной и не упоминалось; -)
Я случайно добавил символ пробела в конце имени.
Много часов пробовал, прежде чем я наконец заметил это. Когда вы это выясняете, всегда что-то просто.
Ответ 9
У меня такая же проблема. В конце концов я нашел почему. Я использовал код из Интернета, чтобы проверить вывод моей процедуры. В конце был вызов Drop(procedure)
поэтому я удалил его сам.