[sql] 저장 프로 시저를 생성하기 전에 존재하는지 확인하는 방법

클라이언트가 “데이터베이스 관리”기능을 실행할 때마다 실행해야하는 SQL 스크립트가 있습니다. 스크립트에는 클라이언트 데이터베이스에서 저장 프로 시저 작성이 포함됩니다. 이러한 클라이언트 중 일부는 스크립트를 실행할 때 이미 스토어드 프로 시저를 가지고있을 수도 있고 그렇지 않을 수도 있습니다. 누락 된 저장 프로 시저를 클라이언트 데이터베이스에 추가해야하지만 T-SQL 구문을 구부리려는 정도는 중요하지 않습니다.

CREATE / ALTER PROCEDURE ‘는 쿼리 일괄 처리에서 첫 번째 문이어야합니다.

작품을 만들기 전에 삭제하는 것을 읽었지만 그렇게하는 것을 좋아하지 않습니다.

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO

CREATE PROCEDURE MyProc
...

저장 프로 시저의 존재 여부를 확인하고 존재하지 않는 경우 만들지 만 존재하는 경우 변경하려면 어떻게해야합니까?



답변

쿼리를 실행할 수있는 곳이면 절차 코드를 실행할 수 있습니다.

다음에 모든 것을 복사하십시오 AS.

BEGIN
    DECLARE @myvar INT
    SELECT  *
    FROM    mytable
    WHERE   @myvar ...
END

이 코드는 저장 프로 시저가하는 것과 똑같은 작업을 수행하지만 데이터베이스쪽에는 저장되지 않습니다.

이는에서 익명 프로 시저라고하는 것과 매우 유사합니다 PL/SQL.

최신 정보:

질문 제목이 약간 혼동됩니다.

프로 시저가없는 경우에만 프로 시저를 작성해야하는 경우 코드는 정상입니다.

SSMS작성 스크립트에서 출력되는 내용은 다음과 같습니다 .

IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'myproc')
                    AND type IN ( N'P', N'PC' ) )
DROP 
CREATE 

최신 정보:

스키마를 포함 할 때이를 수행하는 방법의 예 :

IF EXISTS ( SELECT *
            FROM   sysobjects
            WHERE  id = object_id(N'[dbo].[MyProc]')
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE [dbo].[MyProc]
END

위의 예에서 dbo 는 스키마입니다.

최신 정보:

SQL Server 2016+에서는 다음을 수행 할 수 있습니다.

CREATE OR ALTER PROCEDURE dbo.MyProc


답변

나는 이것이 이미 답변으로 표시되었음을 알고 있지만 다음과 같이 사용했습니다.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('dbo.MyProc'))
   exec('CREATE PROCEDURE [dbo].[MyProc] AS BEGIN SET NOCOUNT ON; END')
GO

ALTER PROCEDURE [dbo].[MyProc]
AS
  ....

절차를 중단하지 않기 위해.


답변

데이터베이스 객체를 제거하기 전에 데이터베이스 객체의 존재를 확인하는 가장 간단한 방법을 찾고 있다면 여기에 한 가지 방법이 있습니다 (예는 위의 예와 같이 SPROC를 사용하지만 테이블, 인덱스 등을 위해 수정 될 수 있음).

IF (OBJECT_ID('MyProcedure') IS NOT NULL)
  DROP PROCEDURE MyProcedure
GO

이것은 빠르고 우아하지만 모든 객체 유형에 고유 한 객체 이름이 있는지 확인해야합니다.

이게 도움이 되길 바란다!


답변

“있는 경우 프로 시저를 변경하고 존재하지 않는 경우에만 삭제하십시오”를 원하지만 항상 프로 시저를 삭제 한 다음 다시 작성하는 것이 더 간단하다고 생각합니다. 프로 시저가 이미있는 경우에만 삭제하는 방법은 다음과 같습니다.

IF OBJECT_ID('MyProcedure', 'P') IS NOT NULL
    DROP PROCEDURE MyProcedure
GO

두 번째 매개 변수는 이야기 OBJECT_ID만을 가진 개체를보고 object_type = 'P', 저장하는 절차 :

AF = 집계 함수 (CLR)

C = 점검 제한 조건

D = DEFAULT (제약 또는 독립형)

F = 외래 키 제약

FN = SQL 스칼라 함수

FS = 어셈블리 (CLR) 스칼라 함수

FT = 어셈블리 (CLR) 테이블 반환 함수

IF = SQL 인라인 테이블 반환 함수

IT = 내부 테이블

P = SQL 저장 프로 시저

PC = 조립 (CLR) 저장 프로 시저

PG = 계획 가이드

PK = 기본 키 제약

R = 규칙 (구식, 독립형)

RF = 복제 필터 절차

S = 시스템 기본 테이블

SN = 동의어

SO = 시퀀스 객체

TF = SQL 테이블 반환 함수

TR = 트리거

다음을 통해 전체 옵션 목록을 얻을 수 있습니다.

SELECT name
FROM master..spt_values
WHERE type = 'O9T'


답변

SQL SERVER 2016부터 new를 사용할 수 있습니다 DROP PROCEDURE IF EXISTS.
DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]

참조 :
https://msdn.microsoft.com/en-us/library/ms174969.aspx


답변

나는 그것이 아주 오래된 게시물입니다 알지만, 따라서 사용하는 사람들을위한 최신 업데이트 추가 상단 검색 결과에서이 보이므로 SQL 서버 2016 SP1을

create or alter procedure procTest
as
begin
 print (1)
end;
go

스토어드 프로 시저가없는 경우이를 작성하지만 존재하는 경우이를 변경합니다.

참고


답변

DROP IF EXISTS는 SQL Server 2016의 새로운 기능입니다.

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

DROP  PROCEDURE IF EXISTS dbo.[procname]