programing

거래SQL에서 다른 트랜잭션을 실행합니다.SQL 스크립트

elecom 2023. 7. 2. 19:02
반응형

거래SQL에서 다른 트랜잭션을 실행합니다.SQL 스크립트

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

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

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

이 작업은 SQL Server Management Studio(SSMS)를 통해 실행됩니다.

감사합니다!

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

또는 openrowset을 사용하여 스크립트를 변수로 읽고 실행합니다.

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

--PRINT @sql
EXEC (@sql)

을 실행하려면 를 실행해야 합니다. 예를 들어, 다음과 것이 있습니다. 스크립트 집합을 실행하려면 다음과 같이 테스트를 실행합니다. :setvar path "C:\code\branch-qa" :r $(path)\tables\client.sql :r $(path)\tables\item.sql :r $(path)\proc\clientreport.sql exec clientreport

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

입니다.EXECUTE명령) 각 절차를 중앙 절차에서 차례로 수행합니다.이는 동일한 스크립트를 반복적으로 실행하거나 다른 매개 변수가 전달된 동일한 스크립트를 실행하려는 경우에 적합합니다.

@Abe Miesler가 (업데이트) 설명하는 것처럼 스크립트가 .sql(또는 모든 종류의 텍스트) 파일인 경우 SQLCMD 모드가 활성화된 경우 SSMS 내에서 :r 명령을 통해 스크립트를 실행할 수 있습니다.정확한 파일 경로와 이름을 알고 스크립팅해야 합니다.저장 프로시저 내에서는 이 작업을 수행할 수 없습니다.

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

10개의 스크립트를 각각의 개별 파일에 보관하고 싶다고 가정할 때, 원하는 작업을 수행하는 가장 쉬운 방법은 osql.exe를 실행하여 원하는 순서대로 10개의 스크립트를 실행하는 배치 파일을 만드는 것입니다.

언급URL : https://stackoverflow.com/questions/5237198/transactsql-to-run-another-transactsql-script

반응형