저장 프로 시저가 존재하거나 존재하지 않는 경우 작동하는 배포 스크립트를 작성해야합니다. 즉, 존재하는 경우 변경해야하며, 그렇지 않으면 작성해야합니다.
SQL에서 어떻게 할 수 있습니까?
SQL Server 2005를 사용하고 있습니다
답변
프로 시저를 삭제하고 작성하면 보안 설정이 해제됩니다. 이로 인해 DBA가 성가 시거나 애플리케이션이 완전히 중단 될 수 있습니다.
내가하는 일은 아직 간단한 저장 프로 시저를 만들지 않는 것입니다. 그런 다음 저장 프로 시저를 원하는대로 변경할 수 있습니다.
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
이런 식으로 보안 설정, 주석 및 기타 메타 데이터는 배포 후에도 유지됩니다.
답변
가장 깨끗한 방법은 존재 여부를 테스트하고 존재하는 경우 삭제 한 다음 다시 작성하는 것입니다. IF 문 안에 “create proc”문을 포함시킬 수 없습니다. 이것은 잘해야합니다 :
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
답변
저장 프로 시저 만 처리하는 경우 가장 쉬운 방법은 proc을 삭제 한 다음 다시 만드는 것입니다. SQL Server의 스크립트 생성 마법사를 사용하여이 작업을 수행하는 모든 코드를 생성 할 수 있습니다.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]
CREATE PROCEDURE YourSproc...
답변
에서 SQL Server 2016 CTP3
당신은 새 사용할 수 있습니다 다이 문 대신 큰 IF
래퍼를
통사론:
삭제 {PROC | 절차} [존재하는 경우] {[schema_name. ] 절차} [, … n]
질문:
DROP PROCEDURE IF EXISTS usp_name
더 많은 정보는 여기에
답변
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
xxx
proc 이름은 어디에 있습니까
답변
이미 말한 것 외에도 다른 접근 방식을 추가하고 차등 스크립트 배포 전략의 사용을 옹호하고 싶습니다. 항상 현재 상태를 확인하고 해당 상태를 기반으로 작동하는 상태 저장 스크립트를 만드는 대신, 잘 알려진 버전에서 업그레이드하는 일련의 상태 비 저장 스크립트를 통해 배포하십시오 . 필자는이 전략을 사용했으며 이제 배포 스크립트가 모두 ‘IF’가 아니므로 시간이 많이 걸립니다.
답변
다음과 같이 쿼리를 작성할 수 있습니다.
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
위의 구문을보다 구체적으로 설명하면 :
OBJECT_ID 는 데이터베이스 내의 개체에 대한 고유 한 ID 번호이며 SQL Server에서 내부적으로 사용됩니다. 우리가 전달되기 때문에 ProcedureName는 당신이 다음 유형의 객체 P 는 호출 된 객체 찾아야하는 SQL 서버를 알려줍니다 ProcedureName 타입이다 절차 즉, P를
이 쿼리는 프로 시저를 찾은 후 사용 가능한 경우이를 삭제하고 새 프로 시저를 작성합니다.
OBJECT_ID 및 오브젝트 유형에 대한 자세한 정보는 다음을 방문하십시오. SYS.Objects