거래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
'programing' 카테고리의 다른 글
| 날짜별 SQL 그룹(시간) (0) | 2023.07.02 |
|---|---|
| allowDiskUse를 가져올 수 없습니다.Pymongo로 작업하는 것이 참입니다. (0) | 2023.07.02 |
| Git master 브랜치를 분기된 저장소의 업스트림 브랜치로 재설정하려면 어떻게 해야 합니까? (0) | 2023.07.02 |
| 함수를 제외한 모든 변수 제거 (0) | 2023.07.02 |
| .NET의 문자열에서 큰따옴표 제거 (0) | 2023.07.02 |