“找不到存储过程”,即使已在 MS SQL Server Management Studio 中创建存储过程

Jac*_*ack 21 sql-server-2008 stored-procedures ssms

testtable在数据库testbase中创建了一个具有以下结构的表:

product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)
Run Code Online (Sandbox Code Playgroud)

我使用了 Microsoft SQL Server 2008 Management Studio。

我创建了一个存储过程testtable_pricesmaller如下

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go
Run Code Online (Sandbox Code Playgroud)

并且能够查看Object ExplorerMicrosoft SQL Server Management Studio上的存储过程。(它在下面的树结构中列出Object Explorer

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller
Run Code Online (Sandbox Code Playgroud)

当我收到以下错误时,我觉得很奇怪:

Could not find the stored procedure 'dbo.testtable_pricesmaller'.
Run Code Online (Sandbox Code Playgroud)

当我执行以下 SQL 语句时:

execute dbo.testtable_pricesmaller 50
Run Code Online (Sandbox Code Playgroud)

它可能缺少什么?

小智 24

IntelliSense 刷新本地缓存应该修复它


Zan*_*ane 7

添加新的存储过程后,您不必重新启动数据库,尽管您需要刷新对象资源管理器才能在那里看到它。

下次添加存储过程时,请尝试从对象资源管理器中运行右键单击执行选项并输入参数并查看它是否运行。如果它没有运行,那么我不确定你的问题是什么。如果它确实运行了,那么它可能很简单,比如 SQL 试图从错误的数据库中进行查询。


Jac*_*ack 5

我终于知道为什么消息出现在 MS SQL Server Management Studio 中了。

MS SQL Server Management Studio 需要在其中创建存储过程后重新启动它。

重新启动 MS SQL Server Management Studio 后,不再出现此类错误。

(奇怪了,是不是每次创建存储过程都要重启?)

  • 您不必重新启动它。 (13认同)
  • 供将来参考:Ctrl-Shift-R 将刷新本地缓存,用于智能感知。 (6认同)
  • IntelliSense 是您所做工作中唯一滞后的部分。执行 exec 语句应该可以在不重新启动 SSMS 的情况下工作。还有其他原因导致它不起作用。我同意@ShawnMelton。 (5认同)
  • @ShawnMelton 我的意思是我关闭 MS SQL Server Management Studio 并重新打开 MS SQL Server Management Studio。我只是觉得很奇怪我必须关闭然后重新打开它。是否有任何我可能缺少的 MS SQL Server Management Studio (SSMS) 配置导致 SSMS 无法反映存储过程已创建? (2认同)

Phi*_*ppe 5

在 SQL Server 2008 中,当在 Windows 帐户下登录时,如果您没有 SYSADMIN 安全级别,那么当您在没有显式指定架构的情况下创建对象时,它可能/将会在 [DOMAIN\username].[ObjectName] 下创建它] 而不是 [dbo].[ObjectName] (我认为它在 SQL Server 2012 中已修复)。

当我降低用户的安全级别时,我遇到了这个问题,并且他正在执行的过程之一是删除并重新创建没有模式的表,因此过程的其余部分崩溃了,因为它无法再次访问该对象。事实证明,这些表现在是在他的域用户名下创建的。

以下是关于此行为的 Microsoft 帖子:

https://learn.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017(查找“隐式架构和用户创建”部分)

未在 dbo 架构下创建表

Windows 用户创建表时 SQL 2008 R2 创建用户/架构

因此,简而言之,您可能要么遇到数据库问题(您在数据库中创建表,但尝试从另一个数据库访问它),要么遇到我刚才描述的问题。