it-swarm.com.ru

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-valueed Functions, но я не могу понять, как его использовать.

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

РЕДАКТИРОВАТЬ

Как указано в выбранном ответе ниже, вы не всегда можете доверять SSMS Intellisense. Одна вещь, которую вы можете попробовать, кроме простой попытки выполнить скрипт, это принудительное обновление Intellisense с помощью сочетаний клавиш CTRL + SHIFT + R

https://blog.sqlauthority.com/2013/07/04/sql-server-how-to-refresh-ssms-intellisense-cache-to-update-schema-changes/

14
Josh Russo

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

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

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

12
Martin Smith

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

CREATE FUNCTION dbo.ufTest 
3
Randy Minder

У меня точно такая же проблема, и моя была исправлена ​​простым перезапуском SQL Server Management Studio.

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

2
jrdev22

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

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

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

0
K Saketh

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

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

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

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

0
AdsFMS

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

0
Malk

У меня просто была проблема, в которой была эта ошибка, и все советы по этой статье также не выполнялись.

Убедитесь, что дважды проверили тип объявления вашей функции и использование этого типа.

Я объявил таблицу типа возврата и попытался вызвать ее с помощью Select functionName(), где мне нужно было использовать SELECT * FROM functionName()

0
TylerSmall19

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

SQL Server Configuration Manager> SQL Server Services > SQL Server > Restart
0
Derptastic