2010-05-21 9 views
1

Я разрабатываю простую архитектуру базы данных в VisualParadigm и в последнее время просматриваю следующий фрагмент кода.Значение хранимой процедуры SQL Server

IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'getType') AND type in (N'P', N'PC')) 
DROP PROCEDURE getType; 

Следующая идет моя хранимая процедура:

CREATE PROCEDURE getType @typeId int 
AS 
SELECT * FROM type t WHERE t.type_id = @typeId; 

Может кто-нибудь объяснить, что это значит/сделать (прежний)?

P.S .: Было бы здорово, если бы вы также могли проверить любые синтаксические ошибки, поскольку я совершенно не знаком с SQL Server и хранимыми процедурами.

ответ

2

Первоначальная часть IF EXISTS проверяет, существует ли хранимая процедура с тем же именем. если он его удаляет, прежде чем создавать его. Без этой проверки вы получите сообщение о том, что хранимая процедура уже существует.

+0

Извините, но это очевидно. Как насчет внутренней части выбора? Что это за sys.objects? –

+2

Извините, это очевидно. Sys.objects - системная таблица, содержащая ВСЕ ОБЪЕКТЫ. Я любезно передал вам вашу надежную документацию по SQL Server (попробуйте), также доступную по адресу http://msdn.microsoft.com/en-us/library/ms190324.aspx - объясняет sys.objects. – TomTom

+0

Как принять комментарий как правильный ответ (а не только его голосовать)? :) –

0

Похоже, что это часть скрипта для создания вашей БД. В первом заявлении будет показано, существует ли ваш sproc, называемый «getType». Если он это сделает, он потеряет его. Зачем? Потому что следующая строка собирается его создать.

Единственный способ создать его и убедиться, что он соответствует текущей версии вашей процедуры, - это изменить create на alter. Это создаст более длинный код, потому что ему придется перечислить sproc дважды. Или он может генерировать динамический sql, который не так чист.

0

Это делает падение и воссоздать

если объект базы данных называется GetType существует:

WHERE object_id = OBJECT_ID(N'getType') 

и это хранимая процедура:

AND type in (N'P', N'PC')) 

затем поместите его перед добавлением вашего хранимая процедура:

DROP PROCEDURE getType; 
1

a CREATE PROCEDURE getType... сбой, если объект уже существует. включив код IF EXISTS..., который выведет объект, если он существует первым, вы устраните ошибку и запустится CREATE....

OBJECT_ID(N'getType') просто возвращает числовой идентификатор объекта с именем N'getType ', а AND type in (N'P', N'PC')) гарантирует, что объект является P = хранимой процедурой или ПК = сборка (CLR).

Вы можете попробовать использовать что-то вроде этого, так что вы можете использовать ALTER, чтобы сохранить права доступа (DROP + CREATE удаляет любое):

BEGIN TRY EXEC ('CREATE PROCEDURE YourProcedureName AS SELECT ''ERROR'' RETURN 999') END TRY BEGIN CATCH END CATCH 
GO 
ALTER PROCEDURE YourProcedureName 
AS 
SELECT 'WORKS!2' 
GO 

EXEC YourProcedureName 

ВЫВОД:

------- 
WORKS!2 

(1 row(s) affected) 
0

Первый запрос падает процедуру, если это существует. Вторая создает новую процедуру, которая принимает целочисленный параметр и возвращает результат.

1

Добавляя сообщение Raj's, нет никаких средств для выполнения «upsert» с хранимыми процедурами. Оператор Create Procedure должен быть первым оператором пакета.Таким образом, следующий будет не работы:

If Not Exists(Select 1 From sys.procedures Where Name = 'getType') 
    Create Procedure... 
Else 
    Alter Procedure... 

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

Сложение

Для решения конкретного вопроса вы сделали в комментариях, sys.objects вид каталога, который содержит список всех объектов (таблицы, ограничения, столбцы, индексы и т.д. Каждая «вещь» в база данных), одним из которых является процедура. Таким образом, это проверяет существование объекта процедуры (на основе фильтров по типу). Первичным ключом таблицы/представления sys.objects является object_id, который является целым числом. В вашем примере они используют функцию OBJECT_ID, чтобы найти идентификатор объекта getType и определить, является ли это процедурой. (Возможно, было бы безопасно использовать только If OBJECT_ID(N'getType') is not null, но на всякий случай есть еще один объект с этим именем, который не является процедурой, они добавили проверку типа объекта).

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