클라이언트가 “데이터베이스 관리”기능을 실행할 때마다 실행해야하는 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 ]
답변
나는 그것이 아주 오래된 게시물입니다 알지만, 따라서 사용하는 사람들을위한 최신 업데이트 추가 상단 검색 결과에서이 보이므로 SQL 서버 2016 SP1을 –
create or alter procedure procTest
as
begin
print (1)
end;
go
스토어드 프로 시저가없는 경우이를 작성하지만 존재하는 경우이를 변경합니다.
답변
DROP IF EXISTS는 SQL Server 2016의 새로운 기능입니다.
DROP PROCEDURE IF EXISTS dbo.[procname]