2013-08-26 29 views
5

Tôi đã lịch sử sử dụng sau đây như một phần của một kịch bản triển khai thủ tục lưu trữ là gì loại để tra cứu ID đối tượng, ví dụ:cách ưa thích để xác định xem một thủ tục lưu trữ tồn tại

OBJECT_ID(N'[dbo].[SPROC_NAME]', N'P') 

Dường như việc sử dụng quá tải đó sẽ làm cho tra cứu OBJECTPROPERTY không cần thiết.

Tôi muốn biết nếu có bất kỳ nhược điểm nào khi chỉ sử dụng quá tải OBJECT_ID và giảm số lần tra cứu OBJECTPROPERTY.

+1

Các đối tượng SQL đều chia sẻ cùng một không gian tên duy nhất. 'OBJECT_ID' trả về ID của một đối tượng với tên đó, nếu nó tồn tại. 'OBJECTPROPERTY' xác nhận rằng đối tượng thực sự là một thủ tục lưu sẵn, vì có thể có một bảng hoặc khung nhìn có tên' [SPROC_NAME] '(và nếu có, bạn sẽ không thể tạo ra một sproc với tên đó). – RBarryYoung

+0

Nếu tham số thứ hai được chỉ định, 'OBJECT_ID' sẽ chỉ trả về giá trị không null nếu một đối tượng thuộc loại đó tồn tại. (Hãy chắc chắn để xác định lược đồ, dunno những gì sẽ xảy ra nếu nó là một bảng trong một lược đồ và một thủ tục khác ...) –

Trả lời

3

tôi thích mẫu này, và đã ngừng sử dụng các OBJECT* chức năng siêu dữ liệu càng nhiều càng tốt, vì they can block even at loose isolation levels:

IF NOT EXISTS 
(
    SELECT 1 FROM sys.procedures AS p 
    INNER JOIN sys.schemas AS s 
    ON p.[schema_id] = s.[schema_id] 
    WHERE p.name = N'Procedure_Name' AND s.name = N'dbo' 
) 
BEGIN 
    EXEC sp_executesql N'CREATE PROCEDURE dbo.Procedure_Name AS'; 
END 
+0

+1. Tôi có xu hướng giảm nếu họ đã tồn tại và sau đó tái tạo, chỉ để đảm bảo tôi luôn nhận được phiên bản mới nhất ... –

+0

@Chuyển lệnh CREATE cho phép cơ thể thực luôn là ALTER, ngay cả khi thủ tục không vẫn tồn tại, do đó không phải tất cả đều phải là SQL động. –

+0

Điểm tốt. ... –

0

my $ .02 -

Sử dụng phương pháp object_id với tham số thứ 2. Nó làm cho mã dễ đọc hơn.

+0

'sys.objects' không phải là bảng hệ thống cũng như khung nhìn tương thích ngược. Đó là một khung nhìn danh mục và tôi nghĩ rằng nó khá chủ quan cho dù 'OBJECT_ID()' dễ đọc hơn hay không, đừng bận tâm rằng nhiều hàm siêu dữ liệu như vậy không tuân theo ngữ nghĩa mức cô lập (nghĩa là chúng có thể chặn ngay cả khi bạn đã đặt read_uncommitted hoặc snapshot)). –

1

tình trạng của bạn có thể ngắn hơn một chút:

IF OBJECT_DEFINITION(OBJECT_ID('dbo.Procedure_Name', 'P')) IS NULL 
    BEGIN 
     EXEC sys.sp_executesql 'CREATE PROCEDURE dbo.Procedure_Name AS' 
    END 

Một cách khác:

IF OBJECT_ID('dbo.Procedure_Name', 'P') IS NULL 
    BEGIN 
     EXEC sys.sp_executesql 'CREATE PROCEDURE dbo.Procedure_Name AS' 
    END 
1

Cách ưa thích của tôi là:

if object_id('x') is not null 
    begin 
    drop procedure x 
    end 
    go 
    create procedure x ... 
    ... 
Các vấn đề liên quan