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, проблема все равно останется.

person Heinrich    schedule 19.03.2021    source источник
comment
какие заявления у вас есть перед этим?   -  person Mitch Wheat    schedule 19.03.2021
comment
Здесь могут быть некоторые подсказки: stackoverflow.com/questions/ 7870501/ и stackoverflow.com/questions/26774216/   -  person zedfoxus    schedule 19.03.2021
comment
@MitchWheat Буквально ничего. Это единственное, что есть в сценарии. Выполняется в своем собственном контексте.   -  person Heinrich    schedule 19.03.2021
comment
@zedfoxus Да, мой текущий обходной путь - это ленивый, если существующий сброс, а затем воссоздание. Он доволен этим.   -  person Heinrich    schedule 19.03.2021
comment
Примечание: вы не должны не использовать префикс sp_ для своих хранимых процедур. Microsoft зарезервировала этот префикс для собственного использования ( см. Именование хранимых процедур), и вы рискуете столкнуться с конфликтом имен в будущем. Это также плохо сказывается на производительности ваших хранимых процедур. Лучше просто избегать sp_ и использовать в качестве префикса что-то другое - или вообще не использовать префикс!   -  person marc_s    schedule 19.03.2021
comment
@marc_s Я проверил потенциальную дублирующую систему SP, и это пришло мне в голову, но это не так. Не знал, что это повлияет на производительность, что приятно знать, спасибо :)   -  person Heinrich    schedule 19.03.2021


Ответы (2)


У меня точно такая же проблема. SQL 2019 (15.0.4053.23)

Я запустил точно такую ​​же хранимую процедуру в другой базе данных без проблем, но в этой конкретной базе данных возникают ошибки. Изменение имени работает, удаление ALTER и только использование CREATE работает. если я СОЗДАЮ процедуру, а затем использую CREATE OR ALTER, она работает.

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

Сообщение 208, уровень 16, состояние 6, процедура sp_bt_annl_stmt_members_select, строка 1 [строка запуска пакета 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

Команды выполнены успешно.

person Sid    schedule 07.04.2021

Сразу после того, как я опубликовал проблему, я нашел решение.

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

Создать или изменить

Вы можете довольно легко создать хранимую процедуру с префиксом как в основной базе данных, так и в любых имеющихся у вас пользовательских базах данных, используя CREATE PROCEDURE. Однако Эрик показывает, что если у вас уже есть хранимая процедура с префиксом sp_ в базе данных master, а затем вы используете синтаксис CREATE OR ALTER для создания хранимой процедуры в пользовательской базе данных с тем же именем, вы получить ошибку «Недопустимое имя объекта» в пользовательской базе данных:*

Я обнаружил, что кто-то создал эти хранимые процедуры и в базе данных master.

person Sid    schedule 07.04.2021