문제

의 일환으로 통합 전략,나는 몇 가지 SQL 스크립트를 실행하기 위해서는 데이터베이스를 업데이트.먼저 이러한 모든 스크립트는지 확인하고 필요한 경우 실행에,예를 들어:

if @version <> @expects
    begin
        declare @error varchar(100);
        set @error = 'Invalid version. Your version is ' + convert(varchar, @version) + '. This script expects version ' + convert(varchar, @expects) + '.';
        raiserror(@error, 10, 1);
    end
else
    begin
        ...sql statements here...
    end

매우 좋습니다.를 제외하고 필요할 경우를 추가 저장된 절차입니다."만들기 proc"명령어야만 명의 배치에서 sql 명령입니다.를 넣어 만들기"proc 에서"나는 경우에 문의 원인 이 오류가 발생할 수 있습니다.

'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.

Ouch!어떻게를 넣어 만드 PROC 명령은 스크립트,그리고 그것을 실행하는 경우 그것은 필요?

도움이 되었습니까?

해결책

여기에 나온:

포장 EXEC(),그래서 다음과 같:

if @version <> @expects
    begin
        ...snip...
    end
else
    begin
        exec('CREATE PROC MyProc AS SELECT ''Victory!''');
    end

사용법은 매우 간단합니다.

다른 팁

설정 NOEXEC 에는 좋은 방법은 스위치를 끄는 일부의 일부 코드

IF NOT EXISTS (SELECT * FROM sys.assemblies WHERE name = 'SQL_CLR_Functions')
  SET NOEXEC ON
GO
CREATE FUNCTION dbo.CLR_CharList_Split(@list nvarchar(MAX), @delim nchar(1) = N',')
RETURNS TABLE (str nvarchar(4000)) AS EXTERNAL NAME SQL_CLR_Functions.[Granite.SQL.CLR.Functions].CLR_CharList_Split
GO
SET NOEXEC OFF

여기에서 찾을:https://codereview.stackexchange.com/questions/10490/conditional-create-must-be-the-only-statement-in-the-batch

P.S.다른 방법으로 설정 PARSEONLY{ON|OFF}.

하지만 조심한 작은 따옴표 안에 당신의 저장된 절차-그들이 필요로하는"수출"을 추가하여 두 번째 하나입니다.첫 번째 대답은 했지만,이 경우에 당신은 그것을 놓쳤다.함정에 대한의 젊은 선수이다.

버전의 데이터베이스는 방법으로 이동,하지만...왜 조건에 따라 저장 프로시저를 만들.에 대한 전망,저장되는 절차,기능,그 조건에 따라 삭제하고 다시 만들 때마다입니다.는 경우 조건에 따라 만들기,그 다음 당신은하지 청소는 데이터베이스에 문제 또는 해킹을 가지고에 넣어 2 년간 전에 다른 개발자가(당신은 또는 나가지 않을 것이라이)이었던 것이라는 확신을 기억을 제거하는 중간 긴급 업데이트합니다.

문제으로 떨어지고 만들은 당신을 잃는 어떤 보안 부여하는 이전에 적용하는 개체는 삭제됩니다.

솔직히 말하자면,제가 정상적으로 동의하@베드로-나는 조건에 따라 삭제한 다음 무조건적으로 다시 만들 때마다입니다.나는 잡은 너무 많은 시간이 과거에 시도할 때 두 번째 스키마 생각의 차이는 데이터베이스와 함께 또는없이,어떤 형태의 제거됩니다.

을 말하고는,자신의 제안@조쉬가 정말 멋진 있습니다.확실히 흥미롭습니다.:-)

이것은 오래된 스레드지만,Jobo 는 잘못된:프로시저를 만들어야에서 첫 번째 문합니다.따라서 사용할 수 없습니다 Exists 을 테스트하기 위해 존재하고 다음 중 하나를 사용하여 CreateAlter.유감이다.

나의 솔루션을 확인하려면 proc 존재하는 경우,그래서 그것을 떨어지고 만들 proc(같은 대답으로@robsoft 만으로 예...)

IF EXISTS(SELECT * FROM sysobjects WHERE Name = 'PROC_NAME' AND xtype='P') 
BEGIN
    DROP PROCEDURE PROC_NAME
END
GO
CREATE PROCEDURE PROC_NAME
    @value  int
AS
BEGIN
    UPDATE  SomeTable
    SET     SomeColumn = 1
    WHERE   Value = @value
END
GO

를 사용하여','존재하는 명령 T-SQL 에서 참조하는 경우에 저장된 proc 존재합니다.않는 경우,'사용'바꾸고,다른 사용하여 만들기''

IF NOT EXISTS(SELECT * FROM sys.procedures WHERE name = 'pr_MyStoredProc')
BEGIN

     CREATE PROCEDURE pr_MyStoredProc AS .....
     SET NOCOUNT ON
END

ALTER PROC pr_MyStoredProc
AS
SELECT * FROM tb_MyTable
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top