복붙노트

[SQL] 거래 SQL은 다른 거래 SQL 스크립트를 실행합니다

SQL

거래 SQL은 다른 거래 SQL 스크립트를 실행합니다

나는 각 테이블을 생성하고 데이터로 채우 10 TRANSACT의 SQL 스크립트가 있습니다.

나는 10 다른 스크립트의 각을 실행 한 마스터 SQL 스크립트를 만들려고하고 있습니다.

현재 TSQL 스크립트 내에서 다른 TSQL 스크립트를 실행하는 마이크로 소프트 SQL 서버 2008 SQL / TRANSACT SQL있는 방법이 있습니까?

이 작업은 SQL Server 관리 Studio (SSMS)를 통해 실행하기위한 것입니다.

감사!

해결법

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

    1.당신이 SSMS에서 .SQL 파일을 실행하려고하는 경우이 시도 :

    당신이 SSMS에서 .SQL 파일을 실행하려고하는 경우이 시도 :

    :r C:\Scripts\Script1.sql
    :r C:\Scripts\Script2.sql
    :r C:\Scripts\Script3.sql
    ...
    

    참고 :이 SQL 명령 모드에서 회전을 실행하기 위해 (쿼리> SQLCMD 모드)

    이 당신이 매우 자주 스크립트를 실행하는 경우 당신은 저장된 프로 시저에 놓아 그들에게 그 방법을 실행하는 것이 좋습니다 ...

    당신은 또한 (좀 더 일반적인 생각) SQLCMD를 통해 수행 할 수 있습니다

    sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql
    
  2. ==============================

    2.아니면 그냥 변수로 스크립트를 읽고 그것을 실행하는 OPENROWSET 사용

    아니면 그냥 변수로 스크립트를 읽고 그것을 실행하는 OPENROWSET 사용

    DECLARE @SQL varchar(MAX)
    SELECT @SQL = BulkColumn
    FROM OPENROWSET
        (   BULK 'MeinPfad\MeinSkript.sql'
        ,   SINGLE_BLOB ) AS MYTABLE
    
    --PRINT @sql
    EXEC (@sql)
    
  3. ==============================

    3.가장 간단한 방법은 스크립트가 저장 프로 시저를 만들 수 및 통화에 중앙 프로 시저에서 차례로 각 절차 (명령을 실행 비아) 것입니다. 당신이 이상 동일한 스크립트 (들)을 실행하려고하고 다시 (또는 전달 다른 매개 변수를 동일한 스크립트)하는 경우이 이상적입니다.

    가장 간단한 방법은 스크립트가 저장 프로 시저를 만들 수 및 통화에 중앙 프로 시저에서 차례로 각 절차 (명령을 실행 비아) 것입니다. 당신이 이상 동일한 스크립트 (들)을 실행하려고하고 다시 (또는 전달 다른 매개 변수를 동일한 스크립트)하는 경우이 이상적입니다.

    SQLCMD 모드가 활성화 될 때, r 명령 : @Abe Miesller 말한대로 스크립트가 .SQL (또는 텍스트의 모든 종류의) 파일을 경우 당신이를 통해 SSMS 내에서 실행할 수 있습니다 (upvoted). 당신은 정확한 파일 경로와 이름을 알고 스크립트해야합니다. 이것은 저장 프로 시저 내에서 수행 할 수 없습니다.

    임의의 파일 이름 (예를 들어, 모든 파일이 현재 하위 폴더에로드)에 대한 "알려진"파일 이름 유용하고 필요한 마지막 대안은 확장 절차 XP_CMDSHELL의 힘을 활용하는 것입니다. 이러한 솔루션은 꽤 빨리 (이과에 간다, 파일, 빌드 목록을 검색하는 데 사용할 차례로 각 파일에 대해 SQLCMD를 호출 xp_cmdshell을 문자열을 통해 실행, 출력 파일을 통해 결과 및 오류 관리) 난 단지 좋겠 그래서 compelx 얻을 수 있습니다 최후의 수단으로이 작업을 수행.

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

    4.당신은 거의 상호 교환 OSQL 또는 더 나은 아직 새로운 SQLCMD를 사용할 수 있습니다. 나는 코드 샘플 주위에 앉아 있지만, 생산에 내가 SQLCMD를 사용하고이 일어난 때문이 예에서 OSQL을 사용하고 있습니다. 여기에 내가 데이터베이스에 대해 업데이트 스크립트를 실행하는 데 사용하는 더 큰 과정에서 코드의 냈다된다. 내가 자료를 추적하는 규칙을 사용하여 내 스크립트의 이름으로 그들은 메이저, 마이너, 릴리스 빌드에 의해 정렬됩니다. 당신은 분명히 내 오류 나눠의 모든 누락, 나는 등 데이터베이스, 설정 변수에서 사용 가능한 스크립트를 당겨하지만 여전히 찾을 수있는 부분이 유용 니펫을.

    당신은 거의 상호 교환 OSQL 또는 더 나은 아직 새로운 SQLCMD를 사용할 수 있습니다. 나는 코드 샘플 주위에 앉아 있지만, 생산에 내가 SQLCMD를 사용하고이 일어난 때문이 예에서 OSQL을 사용하고 있습니다. 여기에 내가 데이터베이스에 대해 업데이트 스크립트를 실행하는 데 사용하는 더 큰 과정에서 코드의 냈다된다. 내가 자료를 추적하는 규칙을 사용하여 내 스크립트의 이름으로 그들은 메이저, 마이너, 릴리스 빌드에 의해 정렬됩니다. 당신은 분명히 내 오류 나눠의 모든 누락, 나는 등 데이터베이스, 설정 변수에서 사용 가능한 스크립트를 당겨하지만 여전히 찾을 수있는 부분이 유용 니펫을.

    OSQL 또는 SQLCMD를 사용하는 방법에 대한 같은 주요 부품 난 당신이 SSMS에서이 코드를 실행하거나 (아마도 일정에 따라라고도 함) 저장 프로 시저 또는 배치 파일에서 할 수 있다는 것입니다. 매우 유연합니다.

    --Use cursor to run upgrade scripts
    DECLARE OSQL_cursor CURSOR
    READ_ONLY
    FOR SELECT FileName 
    FROM #Scripts
    ORDER BY Major, Minor, Release, Build
    
    OPEN OSQL_cursor
    
    FETCH NEXT FROM OSQL_cursor INTO @name
    WHILE (@@fetch_status <> -1)
    BEGIN
        IF ((@@fetch_status <> -2) AND (@result = 0))
        BEGIN
            SET @CommandString = 'osql -S ' + @@ServerName + ' -E -n -b -d ' + @DbName + ' -i "' + @Dir + @name + '"'
            EXEC @result = master.dbo.xp_cmdshell @CommandString, NO_OUTPUT
            IF (@result = 0)
            BEGIN
                SET @Seconds = DATEDIFF(s, @LastTime, GETDATE())
                SET @Minutes = @Seconds / 60
                SET @Seconds = @Seconds - (@Minutes * 60)
                PRINT 'Successfully applied ' + @name + ' in ' + cast(@Minutes as varchar) 
                    + ' minutes ' + cast(@Seconds as varchar) + ' seconds.'
                SET @LastTime = GETDATE()
            END
            ELSE
            BEGIN
                SET @errMessage = 'Error applying ' + @name + '! The database is in an unknown state and the schema may not match the version.'
                SET @errMessage = @errMessage + char(13) + 'To find the error restore the database to version ' + @StartingVersion
                SET @errMessage = @errMessage + ', set @UpToVersion = the last version successfully applied, then run ' + @name
                SET @errMessage = @errMessage + ' manually in Query Analyzer.'  
            END
            IF @name = (@UpToVersion + '.sql')
                GOTO CleanUpCursor --Quit if the final script specified has been run.
        END
        FETCH ENDT FROM OSQL_cursor INTO @name
    END
    
  5. ==============================

    5.당신은 자신의 개별 파일에 10 스크립트를 유지하려는 가정, 난 당신이 실행하는 당신이 원하는 순서대로 10 스크립트를 실행할 OSQL.EXE하는 배치 파일을 생성하는 것하고 싶은 일을 할 수있는 가장 쉬운 방법을 말할 것입니다.

    당신은 자신의 개별 파일에 10 스크립트를 유지하려는 가정, 난 당신이 실행하는 당신이 원하는 순서대로 10 스크립트를 실행할 OSQL.EXE하는 배치 파일을 생성하는 것하고 싶은 일을 할 수있는 가장 쉬운 방법을 말할 것입니다.

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

    6.내가 테스트를 실행하는 말을 나는 일련의 스크립트를 실행하려면 경로 변수를 정의하는 것이 유용, 같은 : : SETVAR 경로 "C : \ 코드 \ 지사 품질 보증" : r에 $ (경로) \ 테이블 \ client.sql : r에 $ (경로) \ 테이블 \ item.sql : r에 $ (경로) \ PROC \ clientreport.sql 간부 clientreport

    내가 테스트를 실행하는 말을 나는 일련의 스크립트를 실행하려면 경로 변수를 정의하는 것이 유용, 같은 : : SETVAR 경로 "C : \ 코드 \ 지사 품질 보증" : r에 $ (경로) \ 테이블 \ client.sql : r에 $ (경로) \ 테이블 \ item.sql : r에 $ (경로) \ PROC \ clientreport.sql 간부 clientreport

  7. from https://stackoverflow.com/questions/5237198/transactsql-to-run-another-transactsql-script by cc-by-sa and MIT license