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


21

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)

我使用了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

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

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller

收到以下错误时,我感到非常奇怪:

Could not find the stored procedure 'dbo.testtable_pricesmaller'.

当我执行以下SQL语句时:

execute dbo.testtable_pricesmaller 50

它可能缺少什么?


您确定您的execute语句在“ testbase”数据库的上下文中运行吗?您可以尝试添加USE语句或完全限定对象名称。
肖恩·梅尔顿

是的,我确实添加了该USE语句,但它给了我错误。
2012年

我必须在我的执行语句中明确定义数据库名称:EXEC [testbase]。[dbo]。[testtable_pricesmaller] 50
Jroonk

Answers:



7

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

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


4

最后,我知道为什么该消息出现在MS SQL Server Management Studio中。

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

重新启动MS SQL Server Management Studio之后,不再存在此类错误。

(奇怪,这是否意味着每次创建存储过程时都必须重新启动它?)


12
您不必重新启动它。
肖恩·梅尔顿

1
@ShawnMelton我的意思是我关闭了MS SQL Server Management Studio,然后重新打开了MS SQL Server Management Studio。我只是觉得很奇怪,必须关闭然后重新打开它。我可能缺少MS SQL Server Management Studio(SSMS)的任何配置,导致SSMS无法反映已创建存储过程吗?
2012年

5
IntelliSense是您所做的唯一滞后部分。执行exec语句应该可以正常工作,而无需重新启动SSMS。还有其他原因导致它无法正常工作。我同意@ShawnMelton。
托马斯·斯金格

@鲨鱼,有趣!如果有人能向我解释为什么我的SSMS表现得如此奇怪,我将不胜感激。
2012年

6
供将来参考:Ctrl-Shift-R将刷新本地缓存,以实现智能感知。
亚当·沙普 Adam Scharp),2016年

3

您的create命令应为

create procedure dbo.testtable_pricesmaller
    @pricelimit money

dbo.在过程名称之前丢失。每当您创建一个过程时,最好使用过程名称来明确定义用户/模式,即过程名称应具有完全合格的签名。

我希望这能帮到您。


3

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

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

这是有关此行为的Microsoft帖子:

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

在dbo模式下未创建表

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

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


2

我知道这很老;我在寻找这个问题的解决方案时遇到了这个问题,我发布了这个答案,希望对其他也找到这个问题的人有所帮助。

就我而言,在使用共享数据源运行SSRS报告时收到错误消息。此共享数据源未指定默认数据库(“ Default Catalog =”参数),我无法将其添加到连接字符串中,因为我没有密码(当您更改SSRS数据源中的内容时,希望您重新输入密码)。

为了解决这个问题,我将SQL Server实例中登录名的默认数据库从master更改为包含报表要执行的存储过程的数据库。

从SSMS运行内容时,请记住“对象资源管理器”窗格是一个连接,而无论您使用的编辑器是一个完全不同的连接。因此,您可能会在对象资源管理器中看到SQL01的对象,但是您在编辑器中运行的代码将针对SQL02运行-多年来,在反复讨论之后,我已经遇到过几次该问题,“为什么不这行得通?” 意识到我的错误。对于编辑器,请查看右下角以查看要连接的实例和数据库。


1

TL; DR:您可能有一个存储过程正在调用另一个不存在的存储过程。


我遇到了这个问题,找到了解决方法。这是发生了什么事。我创建了一个存储过程:

create procedure dbo.MyProc
    ...

然后,我创建了另一个执行第一个存储过程的存储过程。

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc
    ...

一段时间后,我改名dbo.MyProcdbo.MyProc2。重命名之后,当我尝试调用时dbo.MyProcCaller,会出现以下错误消息:

exec dbo.MyProcCaller

找不到存储过程“ RLM.usp_getSecondaryRestrictedLists_Old”。

我的解决方案是更改第二个存储过程以使用新名称:

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc2
    ...

这是检查您是否有此问题的简单方法。单击以修改存储过程的文本,然后执行该文本。如果收到这样的警告,则需要重命名存储过程:

模块“ dbo.MyProcCaller”取决于缺少的对象“ dbo.MyProc”。该模块仍将创建;但是,直到对象存在,它才能成功运行。

(影响1行)


0

这个问题有几年的历史了,但是我只想给后来发现它的像我这样的人带来另一种可能性。

我运行了以下命令:EXEC SP_CONFIGURE'Agent XPs'

并得到描述的错误:消息2812,级别16,状态62,第1行找不到存储过程'SP_CONFIGURE'。

但是后来我记得该服务器设置为区分大小写。因此,此命令运行良好:EXEC sp_configure'Agent XPs'

高温超导

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.