복붙노트

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

SQL

저장 프로 시저를 작성하기 전에 존재하는지 확인하는 방법

나는 클라이언트가 "데이터베이스 관리"기능을 실행 할 때마다 실행해야하는 SQL 스크립트가 있습니다. 스크립트는 클라이언트 데이터베이스에 저장 프로 시저를 생성하는 단계를 포함한다. 이러한 클라이언트 중 일부는 이미 스크립트를 실행시 저장 프로 시저가있을 수 있습니다, 일부는하지 않을 수 있습니다. 나는 클라이언트 데이터베이스에 추가 누락 된 저장 프로 시저가 필요하지만, 내가 얻을, T-SQL 구문을 구부리려고 얼마나 중요하지 않습니다

나는 작품을 만들기 전에 삭제 읽었습니다,하지만 난 그런 식으로 일을 좋아하지 않는다.

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

CREATE PROCEDURE MyProc
...

존재를 않는 경우 어떻게 그것을 저장 프로 시저의 존재에 대한 검사를 추가하고 생성을 존재하지 않는 경우 만 변경할 수 있습니다?

해결법

  1. ==============================

    1.당신은 당신이 쿼리를 실행 할 수있는 절차 적 코드 어디를 실행할 수 있습니다.

    당신은 당신이 쿼리를 실행 할 수있는 절차 적 코드 어디를 실행할 수 있습니다.

    그냥 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 서버 2016+에서, 당신은 할 수 있습니다

    또는 ALTER PROCEDURE dbo.myProc 소유자를 CREATE

  2. ==============================

    2.나는 대답으로이 이미 표시되었습니다 실현,하지만 우리는 이런 식으로 작업을 수행하는 데 사용 :

    나는 대답으로이 이미 표시되었습니다 실현,하지만 우리는 이런 식으로 작업을 수행하는 데 사용 :

    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
      ....
    

    그냥 절차를 떨어 뜨리지 않도록합니다.

  3. ==============================

    3.당신이 그것을 제거하기 전에 데이터베이스 개체의 존재를 확인하는 가장 간단한 방법을 찾고 있다면, 여기에 (예를 들어 그냥 위의 예처럼 SPROC를 사용하지만 테이블, 인덱스, 수정할 수 수 등 ...) 하나의 방법입니다 :

    당신이 그것을 제거하기 전에 데이터베이스 개체의 존재를 확인하는 가장 간단한 방법을 찾고 있다면, 여기에 (예를 들어 그냥 위의 예처럼 SPROC를 사용하지만 테이블, 인덱스, 수정할 수 수 등 ...) 하나의 방법입니다 :

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

    이 신속하고 우아하지만이 점을 고려해야합니다 않기 때문에 당신은 당신이 모든 객체 유형에 대해 고유 개체 이름을 확인해야합니다.

    이게 도움이 되길 바란다!

  4. ==============================

    4.난 당신이 원하는 알고있다 "존재하는 경우 절차를 변경하고 존재하지 않는 경우에만 삭제"하지만 난 그냥 항상을 다시 만들기 다음 절차를 드롭하는 것이 더 간단하다고 믿습니다. 여기에 이미 존재하는 경우에만 절차를 삭제하는 방법은 다음과 같습니다

    난 당신이 원하는 알고있다 "존재하는 경우 절차를 변경하고 존재하지 않는 경우에만 삭제"하지만 난 그냥 항상을 다시 만들기 다음 절차를 드롭하는 것이 더 간단하다고 믿습니다. 여기에 이미 존재하는 경우에만 절차를 삭제하는 방법은 다음과 같습니다

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

    두 번째 매개 변수는 저장 프로 시저를하는 OBJECT_TYPE = 'P'와 객체 만보기에 OBJECT_ID를 알려줍니다 :

    당신은을 통해 옵션의 전체 목록을 얻을 수 있습니다 :

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

    5.SQL 서버 2016로 새 DROP PROCEDURE IF가 존재 사용할 수 있습니다. DROP {PROC | PROCEDURE} {[SCHEMA_NAME [IF 존재]가. ] 프로} ... N]

    SQL 서버 2016로 새 DROP PROCEDURE IF가 존재 사용할 수 있습니다. DROP {PROC | PROCEDURE} {[SCHEMA_NAME [IF 존재]가. ] 프로} ... N]

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

  6. ==============================

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

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

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

    이것은 이미 존재하지 않는 경우 저장 프로 시저를 생성, 존재하지만 그 경우 변경합니다.

    참고

  7. ==============================

    7.DROP IF가 존재 SQL 서버 2016의 새로운 기능입니다

    DROP IF가 존재 SQL 서버 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]
    
  8. ==============================

    8.저도 같은 오류가 발생했습니다. 나는이 스레드가 이미 꽤 많이 죽었 알고 있지만 나는 "익명 절차"이외의 다른 옵션을 설정합니다.

    저도 같은 오류가 발생했습니다. 나는이 스레드가 이미 꽤 많이 죽었 알고 있지만 나는 "익명 절차"이외의 다른 옵션을 설정합니다.

    나는 이런 식으로 해결 :

  9. ==============================

    9.여기에 방법과이 방법을 사용하여 뒤에 몇 가지 추론이다. 그것은 꽤 저장된 프로 시저 편집에 관한 것이 아니라 장점과 단점이 있습니다 ...

    여기에 방법과이 방법을 사용하여 뒤에 몇 가지 추론이다. 그것은 꽤 저장된 프로 시저 편집에 관한 것이 아니라 장점과 단점이 있습니다 ...

    UPDATE : 또한 트랜잭션이 전체 호출을 래핑 할 수 있습니다. 많은 저장된 모든 커밋 할 수있는 단일 트랜잭션 절차 또는 모든 롤백을 포함. 트랜잭션에서 포장의 또 다른 장점은 저장 프로 시저가 항상이 READ UNCOMMITTED 트랜잭션 격리 수준을 사용하지 않는만큼 다른 SQL 연결을 위해 존재입니다!

    1) 단지 프로세스 결정으로 변경합니다을 방지하기 위해. 우리의 프로세스는 IF가 DROP 다음 CREATE EXISTS 항상한다. 새 PROC 가정의 동일한 패턴이 원하는 PROC이다 할 경우는 IF가 ALTER가 ELSE CREATE EXISTS 것 때문에 변경합니다 음식을 장만하는 것은 조금 어렵습니다.

    2) 당신은 당신이 트랜잭션 외부의 동적 SQL에서 프로 시저 업데이트의 순서를 포장 할 수 있도록 일괄 처리의 첫 번째 통화로 / ALTER를 만들 넣어해야합니다. 기본적으로이 절차 업데이트의 전체 스택을 실행하거나 그들에게 DB 백업을 복원하지 않고 모든 다시 롤하려는 경우,이 하나의 일괄 처리로 모든 것을 할 수있는 방법이다.

    IF NOT EXISTS (select ss.name as SchemaName, sp.name as StoredProc 
        from sys.procedures sp
        join sys.schemas ss on sp.schema_id = ss.schema_id
        where ss.name = 'dbo' and sp.name = 'MyStoredProc')
    BEGIN
        DECLARE @sql NVARCHAR(MAX)
    
        -- Not so aesthetically pleasing part. The actual proc definition is stored
        -- in our variable and then executed.
        SELECT @sql = 'CREATE PROCEDURE [dbo].[MyStoredProc]
    (
    @MyParam int
    )
    AS
    SELECT @MyParam'
        EXEC sp_executesql @sql
    END
    
  10. ==============================

    10.이후 SQL 서버 2008에서는 "INFORMATION_SCHEMA.ROUTINES"를 사용할 수 있습니다

    이후 SQL 서버 2008에서는 "INFORMATION_SCHEMA.ROUTINES"를 사용할 수 있습니다

    IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES 
      WHERE ROUTINE_NAME = 'MySP'
            AND ROUTINE_TYPE = 'PROCEDURE') 
    
  11. ==============================

    11.나는 분명히 투표 또는 주석에 필요한 평판을 가지고 있지 않지만, 난 그냥 (더 좋을 수도 sp_executesql을) EXEC를 사용 제프의 대답은 확실히 갈 수있는 방법이라고 말하고 싶었다. 다시 만들기 저장 프로 시저를 다음 삭제하고하는 것은 결국 일을 얻을 수 있지만, 저장 프로 시저가 전혀 존재하지 않는 경우 순간 시간이, 그리고이 될 것입니다 뭔가 특히 경우 즉, 아주 나쁜 될 수 있습니다 반복적으로 실행합니다. 나는 백그라운드 스레드는 IF EXISTS DROP을하고 있었기 때문에 ... 내 응용 프로그램과 모든 종류의 문제를 가진 다른 스레드가 저장 프로 시저를 사용하려고했다 동시에 CREATE했다.

    나는 분명히 투표 또는 주석에 필요한 평판을 가지고 있지 않지만, 난 그냥 (더 좋을 수도 sp_executesql을) EXEC를 사용 제프의 대답은 확실히 갈 수있는 방법이라고 말하고 싶었다. 다시 만들기 저장 프로 시저를 다음 삭제하고하는 것은 결국 일을 얻을 수 있지만, 저장 프로 시저가 전혀 존재하지 않는 경우 순간 시간이, 그리고이 될 것입니다 뭔가 특히 경우 즉, 아주 나쁜 될 수 있습니다 반복적으로 실행합니다. 나는 백그라운드 스레드는 IF EXISTS DROP을하고 있었기 때문에 ... 내 응용 프로그램과 모든 종류의 문제를 가진 다른 스레드가 저장 프로 시저를 사용하려고했다 동시에 CREATE했다.

  12. ==============================

    12.** T-SQL에 저장된 프로 시저를 삭제하고 다시 작성하는 가장 간단한 방법은 **입니다

    ** T-SQL에 저장된 프로 시저를 삭제하고 다시 작성하는 가장 간단한 방법은 **입니다

    Use DatabaseName
    go
    If Object_Id('schema.storedprocname') is not null
    begin
       drop procedure schema.storedprocname
    end
    go
    
    create procedure schema.storedprocname
    as
    
    begin
    end
    
  13. ==============================

    13.여기 내가 사용하는 스크립트입니다. 그것으로, 나는 불필요하게 삭제하고 저장 발동를 다시 마십시오.

    여기 내가 사용하는 스크립트입니다. 그것으로, 나는 불필요하게 삭제하고 저장 발동를 다시 마십시오.

    IF NOT EXISTS (
        SELECT *
        FROM sys.objects
        WHERE object_id = OBJECT_ID(N'[dbo].[uspMyProcedure]')
        )
    BEGIN
      EXEC sp_executesql N'CREATE PROCEDURE [dbo].[uspMyProcedure] AS select 1'
    END
    GO
    
    ALTER PROCEDURE [dbo].[uspMyProcedure] 
        @variable1 INTEGER  
    AS
    BEGIN
       -- Stored procedure logic
    END
    
  14. ==============================

    14.저장 프로 시저를 들어 IF의 존재를 확인

    저장 프로 시저를 들어 IF의 존재를 확인

    IF EXISTS (SELECT * FROM sys.objects 
                WHERE object_id = OBJECT_ID
                 (N'[Schema].[Procedure_Name]') AND type IN (N'P', N'PC'))
    BEGIN
           DROP PROCEDURE [Schema].[Procedure_Name]
           Print('Proceudre dropped => [Schema].[Procedure_Name]')
    END
    

    확인 트리거 존재, 아래 링크를 클릭하여도 기능 http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html IF

  15. ==============================

    15.왜 같은 간단한 방법을 가지 마세요

    왜 같은 간단한 방법을 가지 마세요

        IF EXISTS(SELECT * FROM sys.procedures WHERE NAME LIKE 'uspBlackListGetAll')
        BEGIN
             DROP PROCEDURE uspBlackListGetAll
        END
        GO
    
        CREATE Procedure uspBlackListGetAll
    

    ..........

  16. ==============================

    16.@Geoff I의 대답에 추가하여 SQL 파일 저장 프로 시저, 뷰, 함수 및 트리거에 대한 문을 생성하는 간단한 도구를 만들었습니다.

    @Geoff I의 대답에 추가하여 SQL 파일 저장 프로 시저, 뷰, 함수 및 트리거에 대한 문을 생성하는 간단한 도구를 만들었습니다.

    CodePlex의 @ MyDbUtils를 참조하십시오.

  17. ==============================

    17.내가 궁금해! 왜 내가 좋아하는 전체 쿼리를 작성하지 않습니다

    내가 궁금해! 왜 내가 좋아하는 전체 쿼리를 작성하지 않습니다

    GO
    create procedure [dbo].[spAddNewClass] @ClassName varchar(20),@ClassFee int
    as
    begin
    insert into tblClass values (@ClassName,@ClassFee)
    end
    
    GO
    create procedure [dbo].[spAddNewSection] @SectionName varchar(20),@ClassID       int
    as
    begin
    insert into tblSection values(@SectionName,@ClassID)
    end
    
    Go
    create procedure test
    as
    begin 
    select * from tblstudent
    end
    

    내가 이미 처음 두 절차는 이미 SQL은 처음 두 절차의 오류를 줄 것이다 쿼리를 실행합니다 존재하는 것을 알고 있지만 여전히 마지막 프로 시저를 만들 것 SQL 자체가 이미 존재 무엇을 돌보는되어 내가 항상 내 모든 클라이언트에 할 것입니다!

  18. ==============================

    18.BEGIN) ( '당신의 시저 이름'절차 IF NOT 존재 CREATE ... END를

    BEGIN) ( '당신의 시저 이름'절차 IF NOT 존재 CREATE ... END를

  19. from https://stackoverflow.com/questions/2072086/how-to-check-if-a-stored-procedure-exists-before-creating-it by cc-by-sa and MIT license