Подтвердить что ты не робот

SQLServer не может найти функцию, определенную пользователем, в хранимой процедуре

У меня должны быть некоторые права, но я не могу понять, как это сделать. Следующий код упрощен, но я даже не могу заставить его работать

CREATE FUNCTION ufTest 
(
    @myParm int
)
RETURNS int
AS
BEGIN
    DECLARE @Result int

    SELECT @Result = @myParm + 1

    RETURN @Result
END
GO

Затем я просто хочу иметь возможность вызывать функцию из хранимой процедуры:

CREATE PROCEDURE dbo.[uspGetGroupProfileService]
@id        int
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @otherId int;
    SET @otherId = dbo.ufTest(@id);
END

SQLServer продолжает говорить мне, что он не может найти dbo.ufTest. Он отображается в [DB]\Programmability\Functions\Scalar-value Functions, но я не могу понять, как его использовать.

Кто-нибудь знает, что я делаю неправильно?

4b9b3361

Ответ 1

Работает для меня.

Попробуйте CREATE FUNCTION dbo.ufTest ...

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

Ответ 2

Script из UDF и проверьте имя схемы. Вероятно, это не дбо. Я бы изменил определение UDF, в частности, включить dbo. Другими словами:

CREATE FUNCTION dbo.ufTest 

Ответ 3

Попробуйте вызвать его с помощью select вместо набора. И вы проверили, что выход принадлежит схеме dbo?

Ответ 4

Кажется, это может быть ошибка в редакторе запросов. Функция появляется в дереве в нужном месте, но даже называя функцию dbo.xxxxxx, функция не появляется в редакторе запросов до тех пор, пока вы не закроете и не откроете новый сеанс, а затем появится, если вы введете dbo.

Если вы измените имя функции, то старый не существующий fuction доступен, но не новое имя. Refresh не исправляет это только закрытие сеанса и запуск нового.

Почему я говорю, что это может быть ошибкой, так это то, что свойства разрешений для функции "Таблица" включали синюю ссылку на свойства схемы, но функции Scalar это не так. Таким образом, это может быть более глубокая ошибка, связанная с тем, как схема создается в первую очередь, для которой может быть создана работа. Или, может быть, схема в базе данных, над которой я работаю, не была настроена правильно.

Надеюсь, кто-то еще может осветить этот вопрос.

Ответ 5

Если бы одна и та же проблема была решена, а моя была исправлена, просто перезапустив SQL Server Management Studio.

Просто опубликуйте это, если кто-то все сделает все правильно и до сих пор не может назвать его функцию.

Ответ 6

В крайнем случае, если какой-либо из вышеперечисленных и особенно ответов @jrdev22 не помог вам (и оставил вас в тупик почему), перезапустите службу службы SQL Server в Configuration Manager, поскольку перезагрузка SSMS сама по себе иногда не reset все (например, похоже на создание нового экземпляра входа, но неспособного войти в систему с ним).

SQL Server Configuration Manager> SQL Server Services > SQL Server > Restart

Ответ 7

Если вы не можете найти функцию, которую вы только что создали, для нее есть две причины.

  • Вы используете неправильное имя функции, чтобы добавить имя dbo.function, чтобы получить его.
  • Я также нашел еще одну проблему, например, даже если правильное имя введено, а также оно существует в проводнике объектов после обновления, вы не можете найти его, когда пытаетесь использовать эту функцию.

В этом случае просто закройте сервер sql и откройте его, и вы сможете увидеть эту функцию.