Значение хранимой процедуры SQL Server - PullRequest
1 голос
/ 21 мая 2010

Я разрабатываю простую архитектуру базы данных в VisualParadigm и недавно перешел к следующему фрагменту кода.

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 и хранимых процедурах.

Ответы [ 6 ]

2 голосов
/ 21 мая 2010

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

1 голос
/ 21 мая 2010

Если добавить к сообщению Радж, нет способа сделать "upsert" с хранимыми процедурами.Оператор Создать процедуру должен быть первым оператором пакета.Таким образом, следующее не будет работать:

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

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

ADDITION

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

1 голос
/ 21 мая 2010

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

OBJECT_ID(N'getType') просто возвращает числовой идентификатор объекта с именем N 'getType 'и AND type in (N'P', N'PC')) гарантирует, что объект является хранимой процедурой P = или PC = Assembly (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 голосов
/ 21 мая 2010

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

0 голосов
/ 21 мая 2010

Это делает сброс и воссоздать

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

WHERE object_id = OBJECT_ID(N'getType')

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

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

затем добавьте его перед добавлением хранимой процедуры:

DROP PROCEDURE getType;
0 голосов
/ 21 мая 2010

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

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

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