SQLServer не может найти определенную пользователем функцию в хранимой процедуре - PullRequest
15 голосов
/ 15 января 2011

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

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/

Ответы [ 8 ]

12 голосов
/ 15 января 2011

У меня работает.

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

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

3 голосов
/ 15 января 2011

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

CREATE FUNCTION dbo.ufTest 
2 голосов
/ 30 сентября 2016

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

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

1 голос
/ 03 декабря 2017

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

SQL Server Configuration Manager> SQL Server Services > SQL Server > Restart
0 голосов
/ 21 сентября 2018

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

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

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

0 голосов
/ 05 января 2018

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

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

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

0 голосов
/ 16 октября 2014

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

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

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

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

0 голосов
/ 15 января 2011

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

...