복붙노트

[SQL] SQLCMD를 사용하여 PostDeployment.sql 스크립트에 조건부 논리

SQL

SQLCMD를 사용하여 PostDeployment.sql 스크립트에 조건부 논리

내 프로젝트에 대한 스키마 및 초기 테스트 데이터를 관리하기 위해 (비주얼 스튜디오)는 SQL 2008 데이터베이스 프로젝트를 사용하고 있습니다. "R"구문 atabase 프로젝트는 SQLCMD의를 사용하여 다른 스크립트의 숫자를 포함하는 사후 배포를 사용합니다.

조건부로 SQLCMD 변수에 따라 특정 파일을 포함에 나는 수 있도록하고 싶습니다. 이 날 (멀티 테넌트 (multi-tenant) 시스템에 대한) 데이터의 다른 구성과 설정에 프로젝트를 데이터베이스의 다양한 버전을 우리의 야간 빌드 여러 번 실행 할 수 있습니다.

나는 다음을 시도했다 :

IF ('$(ConfigSetting)' = 'Configuration1')
  BEGIN
    print 'inserting specific configuration' 
:r .\Configuration1\Data.sql
  END
ELSE
  BEGIN
    print 'inserting generic data' 
:r .\GenericConfiguration\Data.sql
  END

하지만 컴파일 오류가 발생합니다 : SQL01260 : A는 치명적인 파서 오류가 발생했습니다 Script.PostDeployment.sql

사람이 오류를 보거나 이런 방식으로 유연하게 자신의 배치 후 스크립트를 구성하는 데 성공 했습니까? 아니면 내가 완전히 잘못된 방법으로 이것에 대해 갈거야?

감사, 롭

추신 또한 주위 그래서 파일의 경로는이 게시물에 유사한 변수이라고이 변경 시도했습니다. 하지만이 경로가 잘못되었다고 말하는 나에게 오류를 제공합니다.

해결법

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

    1.최신 정보

    최신 정보

    지금 발견 한 나의 링크 된 스크립트 중 일부는 GO 문을 필요로하기 때문에 나를 위해 일을하지 않습니다 위의 경우 / 다른 구문. 본질적으로이가 무효 sytax가되도록 R은 인라인 스크립트를 가져옵니다.

    (나처럼) 그런 다음이 주위에 어떤 쉬운 방법이없는 링크 된 스크립트에서 GO 문이 필요하면 내가 따라 빌드시 주요 포스트 depeployment 스크립트를 덮어 쓸 내 프로젝트를 변경 한 후 몇 가지 사후 배포 스크립트를 생성하고 결국 빌드 구성에. 이것은 지금 필요한 일을하지만, 더 쉬운 방법이 있어야처럼 보인다!

    같은 일을 필요로하는 누군가를 위해 -이 게시물에 유용한 발견

    그래서 내 프로젝트에 나는 다음 포스트 배치 파일이 있습니다 :

    나는 그 (오른쪽 언로드 한 후 마우스 오른쪽 버튼으로 클릭 편집을 클릭) 프로젝트 파일의 끝에 다음을 추가 :

      <Target Name="BeforeBuild">
          <Message Text="Copy files task running for configuration: $(Configuration)" Importance="high" />
          <Copy Condition=" '$(Configuration)' == 'Release' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
          <Copy Condition=" '$(Configuration)' == 'Debug' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
          <Copy Condition=" '$(Configuration)' == 'Configuration1' " SourceFiles="Scripts\Post-Deployment\Configuration1.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
      </Target>
    

    마지막으로, 솔루션의 설치 일치하는 빌드 구성에 필요합니다.

    또한, 다른 작업 방법을 시도하는 사람을 위해, 나는 또한 운없이 다음을 시도 :

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

    2.나는 NOEXEC 방법을 사용하여 문제를 해결할 수 있었다.

    나는 NOEXEC 방법을 사용하여 문제를 해결할 수 있었다.

    그래서, 대신의 :

    IF ('$(ConfigSetting)' = 'Configuration1')
     BEGIN
        print 'inserting specific configuration' 
        :r .\Configuration1\Data.sql
     END
    

    나는 조건부 반전 가져온 문을 (들) thusly 히 스킵 NOEXEC ON을 설정합니다 :

    IF ('$(ConfigSetting)' <> 'Configuration1')
        SET NOEXEC ON
    
    :r .\Configuration1\Data.sql
    
    SET NOEXEC OFF
    

    당신이 당신이 후속 문을 실행하려는 경우 전원이 다시 설정합니다.

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

    3.여기에 내가 디버그에 대한 테스트 데이터를 배포하지만 구성을 해제하지 않도록 사후 배포 프로세스 내에서 조건부 배포를 처리하고 방법입니다.

    여기에 내가 디버그에 대한 테스트 데이터를 배포하지만 구성을 해제하지 않도록 사후 배포 프로세스 내에서 조건부 배포를 처리하고 방법입니다.

    첫째, 솔루션 탐색기에서 속성 폴더 프로젝트를 열고, 새로운 SqlCmd.variables 파일을 추가 마우스 오른쪽 단추로 클릭합니다.

    파일 Debug.sqlcmdvars의 이름을 지정합니다.

    파일 내에서 사용자 정의 변수를 추가 한 다음 $ (BuildConfiguration)라는 최종 변수를 추가 및 디버그에 값을 설정합니다.

    릴리스에 $ (BuildConfiguration)를 설정하는 Release.sqlcmdvars를 만드는 과정을 반복합니다.

    지금, 당신의 설정을 구성합니다 배포 탭으로 프로젝트 속성 페이지를 엽니 다. 상단 드롭 다운 메뉴에서 디버그로 구성을 설정합니다. 하단의 드롭 다운에서 (SQL 명령 변수), 속성 \ Debug.sqlcmdvars에 파일을 설정합니다.

    릴리스로 반복합니다 : 상단 드롭 다운 메뉴에서 릴리스로 구성을 설정합니다. 하단의 드롭 다운에서 (SQL 명령 변수), 속성 \ Release.sqlcmdvars에 파일을 설정합니다.

    지금, 당신의 Script.PostDeployment.sql 파일 내에서, 당신은 다음과 같은 조건 논리를 지정할 수 있습니다 :

    IF 'Debug' = '$(BuildConfiguration)'
    BEGIN
    PRINT '***** Creating Test Data for Debug configuration *****';
    :r .\TestData\TestData.sql
    END
    

    솔루션 탐색기에서 마우스 오른쪽 상단 레벨 솔루션 및 오픈 구성 관리자를 클릭합니다. 당신은 당신의 빌드 활성화 된 구성을 지정할 수 있습니다. 또한 MSBuild.exe를 명령 줄에서 구성을 지정할 수 있습니다.

    당신은 당신의 릴리스 빌드가 개발자 테스트 데이터를 구축 지금 왔지,하지만하지!

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

    4.롭 밖으로 일로서이 그것을 시작 내에서 / END 문 둥지처럼, GO 문은 연결된 SQL 스크립트를 사용할 수 없습니다.

    롭 밖으로 일로서이 그것을 시작 내에서 / END 문 둥지처럼, GO 문은 연결된 SQL 스크립트를 사용할 수 없습니다.

    그러나, 나는 그의에 다른 해결책이 - 가능하면, 참조 된 스크립트에서 모든 GO 문을 제거하고 END 문 다음 하나 하나를 넣어 :

    IF '$(DeployTestData)' = 'True'
    BEGIN
        :r .\TestData\Data.sql
    END
    GO -- moved from Data.sql
    

    테스트 스크립트 배포 온 / 오프 날에 켤 수 있습니다 나는 또한 $ (DeployTestData)라고 내 sqlcmdvars 파일에 새 변수를 만들었으므로주의.

  5. ==============================

    5.나는 꽤 잘 일한 MSDN 블로그에서 해킹을 발견했다. 트릭은 임시 스크립트 파일에 명령을 작성하고 그 대신 스크립트를 실행하는 것입니다. 기본적으로 SQLCMD 동적 SQL에 해당.

    나는 꽤 잘 일한 MSDN 블로그에서 해킹을 발견했다. 트릭은 임시 스크립트 파일에 명령을 작성하고 그 대신 스크립트를 실행하는 것입니다. 기본적으로 SQLCMD 동적 SQL에 해당.

    -- Helper newline variable
    :setvar CRLF "CHAR(13) + CHAR(10)"
    GO
    -- Redirect output to the TempScript.sql file
    :OUT $(TEMP)\TempScript.sql
    
    IF ('$(ConfigSetting)' = 'Configuration1')
      BEGIN
        PRINT 'print ''inserting specific configuration'';' + $(CRLF)   
        PRINT ':r .\Configuration1\Data.sql' + $(CRLF)
      END
    ELSE
      BEGIN
        PRINT 'print ''inserting generic data'';' + $(CRLF) 
        PRINT ':r .\GenericConfiguration\Data.sql' + $(CRLF)
      END
    GO
    -- Change output to stdout
    :OUT stdout
    
    -- Now execute the generated script
    :r $(TEMP)\TempScript.sql
    GO
    

    TempScript.sql 파일은 다음 중 하나를 포함합니다 :

    print 'inserting specific configuration';   
    :r .\Configuration1\Data.sql
    

    또는

    print 'inserting generic data';
    :r .\GenericConfiguration\Data.sql
    

    $의 값 (ConfigSetting)에 따라 그리고이 실행될 때 GO 문 등 아무런 문제가 없을 것입니다.

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

    6.나는 롭 새의 솔루션에 의해 영감을했다. 그러나, 나는 단순히 선택한 빌드 구성에 따라 사후 배포 스크립트를 대체하기 위해 빌드 이벤트를 사용하고 있습니다.

    나는 롭 새의 솔루션에 의해 영감을했다. 그러나, 나는 단순히 선택한 빌드 구성에 따라 사후 배포 스크립트를 대체하기 위해 빌드 이벤트를 사용하고 있습니다.

  7. from https://stackoverflow.com/questions/7151021/conditional-logic-in-postdeployment-sql-script-using-sqlcmd by cc-by-sa and MIT license