Mam historycznie stosowane następujące jako część zapisanego skryptu wdrażania procedury:Jaki jest preferowany sposób określić, czy procedura przechowywana istnieje
IF NOT EXISTS (SELECT * FROM sys.objects O
WHERE O.[object_id] = OBJECT_ID(N'[dbo].[SPROC_NAME]')
AND OBJECTPROPERTY(O.[object_id],N'IsProcedure') = 1)
EXEC('CREATE PROCEDURE [dbo].[SPROC_NAME] AS')
GO
ALTER PROCEDURE [dbo].[SPROC_NAME]
AS
BEGIN ...
nie wiedziałem o przeciążeniu do OBJECT_ID
który trwa wpisz identyfikator obiektu dla odnośnika, na przykład:
OBJECT_ID(N'[dbo].[SPROC_NAME]', N'P')
wydaje się, że przy użyciu tego przeciążenia uczyniłoby odnośnika OBJECTPROPERTY
niepotrzebne.
Chciałbym wiedzieć, czy istnieje jakakolwiek wada polegająca na przeciążeniu i porzuceniu wyszukiwania OBJECT_ID
i porzuceniu wyszukiwania OBJECTPROPERTY
.
Obiekty SQL mają tę samą unikalną przestrzeń nazw. 'OBJECT_ID' zwraca identyfikator obiektu o tej nazwie, jeśli istnieje. "OBJECTPROPERTY" potwierdza, że obiekt jest faktycznie procedurą zapisaną, ponieważ może istnieć tabela lub widok o nazwie "[SPROC_NAME]" (a jeśli tak, to nie będzie można utworzyć sproca z tą nazwą). – RBarryYoung
Jeśli zostanie podany drugi parametr, funkcja "OBJECT_ID" zwróci wartość inną niż null, jeśli obiekt tego typu istnieje. (Pamiętaj, aby określić schemat, nie wiem co się stanie, jeśli jest to tabela w jednym schemacie, a procedura w innym ...) –