2013-07-11 3 views
4

У меня есть база данных SQL Server 2008 R2 с хранимой процедурой, которая может существовать или не существовать.Сохраненная процедура не существует и не существует

Если я запустил sp_help spThing, он возвращает строку, как если бы она существовала (имя: spThing, владелец: dbo, тип: хранимая процедура).

Если я пытаюсь создать новую хранимую процедуру с тем же именем, я получаю сообщение об ошибке «В базе данных уже есть объект с именем« spThing ».

НО

Если я бегу SELECT OBJECT_ID('dbo.spThing'), она возвращает NULL.

Если я запустил EXEC spThing, он говорит: «Не удалось найти хранимую процедуру« spThing ».

Если я запустил DROP spThing, в нем говорится: «Невозможно отказаться от процедуры« spThing », потому что она не существует или у вас нет разрешения».

Если я запустил SELECT * FROM sys.objects WHERE name = 'spThing', у меня нет строки.

Если я запустил SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'spThing', у меня нет строки.

Все они были запущены из того же соединения, что и административный пользователь.

Существует ли хранимая процедура?

Edit:

Сам SP тривиальный выбор, вдоль линий:

CREATE PROCEDURE spThing 
    @Param int 
AS 
BEGIN 

    SELECT strThing 
    FROM tblThing 
    WHERE lngParam = @Param; 

END 
+1

Просьба указать 'DDL' вашего sp. – Devart

+0

Это просто тривиальный запрос, добавленный к вопросу. – Paul

+0

Очень странно, если объект существует 'OBJECT_ID ('. ')' всегда не является нулевым.Проверьте имя схемы по умолчанию. – Devart

ответ

5

Все работает отлично -

IF OBJECT_ID ('dbo.spThing') IS NOT NULL 
    DROP PROCEDURE dbo.spThing 
GO 

SELECT OBJECT_ID('dbo.spThing') 
GO 

CREATE PROCEDURE dbo.spThing 

    @Param INT 

AS BEGIN 

    SELECT strThing 
    FROM dbo.tblThing 
    WHERE lngParam = @Param 

END 
GO 

SELECT OBJECT_ID('dbo.spThing') 

Выход -

----------- 
NULL 
(1 row(s) affected) 

----------- 
664283184 
(1 row(s) affected) 
+0

Благодарим вас за помощь. Я не пытался попробовать это, прежде чем перезапускать экземпляр SQL Server, поэтому я не уверен, работало бы это или нет. – Paul

+0

Добро пожаловать @Paul. – Devart

0

Для моего ответа он существует в dbo.spTh рый, но не существует в sys.spThing

я не конкретный ответ:

есть 2 тип процедуры магазина, 1 для системы, и я для databaseobject. 1 попытка paul и devart - создать dbo.spthing.

во-первых, paul сказать, если SELECT * FROM sys.objects WHERE name = 'spThing' return no row mean не существует в системе хранимой процедуры и devart try создается в dbo.Spthing и вернет результат.

просто интересно, ваш вопрос правильно на этой линии или не ВЫБРАТЬ OBJECT_ID («») dbo.spThing , потому что она будет существовать вместо не существует

еще более, ты бежать sp_help spThing и владелец ДБО так ваш dbo.spthing существует. но не sys.spthing

+0

Спасибо за ваш ответ. 'SELECT OBJECT_ID ('sys.spThing')' также возвращает NULL. Однако это исправлено. – Paul

+0

Добро пожаловать @Paul –

1
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spThing]') 
      AND TYPE IN (N'P', N'PC')) 
DROP PROCEDURE [dbo].[spThing]; 
GO 

CREATE PROCEDURE [dbo].[spThing] 
AS 
BEGIN 

-- Code here 

END 
GO 
Смежные вопросы