IT TIP

다른 TransactSQL 스크립트를 실행하기위한 TransactSQL

itqueen 2020. 12. 15. 20:38
반응형

다른 TransactSQL 스크립트를 실행하기위한 TransactSQL


각각 테이블을 만들고 데이터로 채우는 10 개의 트랜잭션 SQL 스크립트가 있습니다.

10 개의 다른 스크립트를 각각 실행할 마스터 SQL 스크립트 1 개를 만들려고합니다.

Microsoft SQL Server 2008 용 TSQL / TRANSACTSQL을 사용하여 현재 tsql 스크립트 내에서 다른 tsql 스크립트를 실행하는 방법이 있습니까?

이는 SSMS (SQL Server Management Studio)를 통해 실행하기위한 것입니다.

감사!


SSMS에서 .sql 파일을 실행하려는 경우 다음을 시도하십시오.

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

참고 : 실행하려면 SQL 명령 모드를 켜십시오 (쿼리> SQLCMD 모드).

이것이 당신이 꽤 자주 실행하는 스크립트라면 저장된 proc에 드롭하고 그런 식으로 실행하는 것을 고려할 수 있습니다.

sqlcmd를 통해 할 수도 있습니다 (더 일반적이라고 생각합니다).

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

또는 openrowset을 사용하여 스크립트를 변수로 읽고 실행하십시오.

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

--PRINT @sql
EXEC (@sql)

가장 간단한 방법은 스크립트를 저장 프로 시저로 만들고 EXECUTE중앙 프로 시저에서 각 프로 시저를 차례로 호출 ( 명령을 통해 )하는 것입니다. 똑같은 스크립트를 반복해서 실행하려는 경우 (또는 다른 매개 변수가 전달 된 동일한 스크립트)에 이상적입니다.

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

"알려진"파일 이름과 함께 사용할 수 있고 임의의 파일 이름 (예 : 현재 하위 폴더에로드 된 모든 파일)에 필요한 마지막 대안은 확장 프로 시저의 기능을 활용하는 것입니다 XP_CMDSHELL. 이러한 솔루션은 매우 빠르게 compelx를 얻을 수 있습니다 (파일 목록을 검색하고 xp_cmdshell을 통해 각 파일에 대해 SQLCMD를 호출하는 문자열을 빌드 및 실행하고 출력 파일을 통해 결과와 오류를 관리하며 계속 진행됨). 최후의 수단으로 이것을하십시오.


osql 이상을 사용할 수 있지만 최신 sqlcmd는 거의 같은 의미로 사용할 수 있습니다. 이 예제에서는 osql을 사용하는 이유는 코드 샘플이 주변에 있지만 프로덕션에서는 sqlcmd를 사용하고 있기 때문입니다. 다음은 데이터베이스에 대해 업데이트 스크립트를 실행하는 데 사용하는 더 큰 절차의 코드입니다. 릴리스를 추적하는 규칙을 사용하여 스크립트 이름을 지정하면 메이저, 마이너, 릴리스, 빌드별로 정렬됩니다. 분명히 내 모든 오류 처리, 데이터베이스에서 사용 가능한 스크립트를 가져 오는 부분, 설정 변수 등이 누락되었지만 여전히이 스 니펫이 유용 할 수 있습니다.

내가 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

Assuming you want to keep the 10 scripts in their own individual files, I would say the easiest way to do what you want would be to create a batch file that executes osql.exe to execute the 10 scripts in the order you want.

ReferenceURL : https://stackoverflow.com/questions/5237198/transactsql-to-run-another-transactsql-script

반응형