SQL Server:奇怪的无效对象名称

问题描述

我正在尝试创建一个存储过程,但出现此错误

消息 208,级别 16,状态 6,过程 SP_MergeStagedPoliticalPartyAgents,第 1 行 [批处理起始行 0]
无效的对象名称“SP_MergeStagedPoliticalPartyAgents”。

sql如下,减去内容

CREATE OR ALTER PROCEDURE SP_MergeStagedPoliticalPartyAgents
AS
BEGIN
    -- Content removed for brevity
END

如果我以任何方式更改名称,即添加额外的 s,或删除末尾的 s。它可以 100% 正常工作,所以我的问题是我使用的这个特定名称是什么导致它失败?

sql Server 是否有违反此名称名称验证正则表达式?是保留名称吗?

更奇怪的附加 IMO:为了测试我是否去:

CREATE PROCEDURE SP_MergeStagedPoliticalPartyAgents
AS
BEGIN
    -- Content removed for brevity
END

它运行良好并在此基础上创建存储过程,从那时起 CREATE OR ALTER PROCEDURE SP_MergeStagedPoliticalPartyAgents 语句工作正常。

似乎不存在具有此名称的存储过程,它会在 CREATE OR ALTER PROCEDURE SP_MergeStagedPoliticalPartyAgents 上失败,但如果是第一次初始化,则会传递 CREATE SP_MergeStagedPoliticalPartyAgents

注意:

  • 我已经以同样的方式创建了其他存储过程,这些都很好
  • 这不是权限问题,因为我可以很好地创建存储过程。
  • 通过 VS 运行脚本会导致相同的问题,因此它与 SMSS 无关
  • 这也不是内容。如果我用基本的 select * from table 替换内容,问题仍然存在。

解决方法

我遇到了完全相同的问题。 SQL 2019 (15.0.4053.23)

我在另一个数据库上运行了完全相同的存储过程,没有任何问题,但在这个特定的数据库上它出错了。更改名称有效,删除 ALTER 并仅使用 CREATE 有效。如果我创建过程然后使用创建或更改,它会起作用。

CREATE OR ALTER PROCEDURE dbo.sp_bt_annl_stmt_members_select
AS
SELECT * FROM sysusers

消息 208,级别 16,状态 6,过程 sp_bt_annl_stmt_members_select, Line 1 [Batch Start Line 0] 无效的对象名称 'dbo.sp_bt_annl_stmt_members_select'。

CREATE PROCEDURE dbo.sp_bt_annl_stmt_members_select
AS
SELECT * FROM sysusers

命令成功完成。

再次运行 CREATE OR ALTER 有效

CREATE OR ALTER PROCEDURE dbo.sp_bt_annl_stmt_members_select
AS
SELECT * FROM sysusers

命令成功完成。

,

在我发布问题后,我找到了解决方案。

https://bornsql.ca/blog/remember-this-if-you-want-to-use-sp_/

创建或更改

您可以使用 CREATE PROCEDURE 在 master 数据库和您拥有的任何用户数据库中轻松创建带有前缀的存储过程。然而,Erik 显示的是,如果您在 master 数据库中已经有一个名称带有 sp_ 前缀的存储过程,然后使用 CREATE OR ALTER 语法在用户数据库中创建一个具有相同名称的存储过程,您将在用户数据库中得到“无效的对象名称”错误:*

我发现有人也在 master 数据库中创建了这些存储过程。