다른 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
'IT TIP' 카테고리의 다른 글
setup.py 및 / bin /에 파일 추가 (0) | 2020.12.15 |
---|---|
부호있는 문자에서 부호없는 문자로 변환하고 다시 되 돌리시겠습니까? (0) | 2020.12.15 |
항상 키워드 인수를 사용하지 않는 이유가 있습니까? (0) | 2020.12.15 |
스칼라 객체 유형에 대한 classOf를 얻는 방법 (0) | 2020.12.15 |
bash를 사용하여 텍스트 파일에서 처음 두 줄과 마지막 네 줄을 삭제하는 방법은 무엇입니까? (0) | 2020.12.15 |