SQLServer在存储过程中找不到我的用户定义函数函数

时间:2011-01-15 00:14:03

标签: sql-server stored-procedures user-defined-functions

我必须有一些权限错误,但我无法弄清楚如何。以下代码已简化,但我甚至无法使其工作

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-valued函数下,但我无法弄清楚如何使用它。

任何人都知道我做错了什么?

修改

如下面所选答案所示,您无法始终信任SSMS智能感知。除了尝试执行脚本之外,您可以尝试的一件事是用CTRL + SHIFT + R强制进行Intellisense刷新

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

8 个答案:

答案 0 :(得分:12)

适合我。

尝试CREATE FUNCTION dbo.ufTest ...

我假设您的默认架构不能是dbo,并且它最终会以不同的架构结束。否则,我能想到的唯一解释是你可能需要授予它权限。

答案 1 :(得分:3)

编写UDF脚本并检查架构名称。这可能不是dbo。我会将UDF定义更改为专门包含dbo。换句话说:

CREATE FUNCTION dbo.ufTest 

答案 2 :(得分:2)

有完全相同的问题,我只需重新启动SQL Server Management Studio即可修复。

只是张贴这个以防万一其他人做的一切都是正确的,但仍然无法调用他的功能。

答案 3 :(得分:1)

作为 last 度假胜地,如果上述任何一个,尤其是@ jrdev22的答案对您没有帮助(并且让您难以理解),请在{中重新启动SQL Server 服务 {3}}因为单独重新启动SSMS有时不会重置所有内容(例如,类似于创建新登录实例但无法使用它登录时)。

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

答案 4 :(得分:0)

尝试使用select而不是set来调用它。你检查出来是否属于dbo架构?

答案 5 :(得分:0)

它似乎可能是查询编辑器中的错误。函数在树中出现在正确的位置,但即使命名函数dbo.xxxxxx,函数也不会出现在查询编辑器中,直到您关闭并打开一个新会话,然后如果您键入dbo,它就会出现。

如果更改了该功能的名称,则旧的非现有功能可用,但不能使用新名称。刷新并不能解决此问题,只关闭会话并开始新的会话。

为什么我说这可能是一个错误,因为Table函数的权限属性包含一个指向架构属性的蓝色链接,但是它没有包含标量函数。因此,对于可能存在解决方案的架构设置方式,它可能是一个更深层次的错误。或者,我正在处理的数据库中的模式尚未正确设置。

希望其他人可以对这个问题有所启发。

答案 6 :(得分:0)

如果您无法找到刚刚创建的功能,则有两个原因。

  1. 您正在使用错误的函数名称来添加dbo.function名称以获取它。
  2. 我还发现了另外一个问题,即使输入了正确的名称,并且它在刷新后存在于对象资源管理器中,当您尝试使用该功能时无法找到它。
  3. 在这种情况下,只需关闭sql server并重新打开它,你应该能够看到该功能。

答案 7 :(得分:0)

我只是遇到一个问题,那就是错误,并且本专栏的所有建议也都失败了。

请确保仔细检查您的函数声明类型和该类型的用法。

我声明了一个返回类型表,并尝试在需要使用Select functionName()的地方使用SELECT * FROM functionName()进行调用