"не удалось найти хранимую процедуру"

Я поддерживаю классический веб-сайт 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) поэтому я удалил его сам.