2012-05-24 1 views
1

각 주간 스프린트 후에 여러 개의 MSQL 스크립트가 들어갈 폴더가 있습니다. 예를 들어, 오늘 10 개의 스크립트가 폴더에 저장되었습니다. 그런 다음 각 스크립트를 개별적으로 열고 해당 데이터베이스에 대해 실행해야했습니다. 실행해야하는 데이터베이스는 파일 이름에 있습니다. 예 : [2] [CRMdata] UpdateProc.sqlSQL 스크립트를 실행하는 박쥐 파일 만들기

[2]는 스크립트가 실행되는 순서이므로 스크립트 [1]을 실행해야합니다. [CRMdata]는 내가 실행해야하는 데이터베이스입니다.

이 프로세스는 매우 귀찮습니다. 특히 순차적으로 실행될 스크립트가 50 개인 경우 매우 중요합니다. 더 쉬운 방법이 있는지 궁금합니다. Perhpas .bat 파일은 파일 이름을 읽고 스크립트 번호를 기반으로 순차적으로 스크립트를 실행하며 파일 이름에 지정된 데이터베이스에 대해 실행합니다.

도움을 주시면 감사하겠습니다. 감사합니다. .

+3

"배치 파일"이라고하기 때문에 Windows라고 가정합니다. VBscript 또는 Windows Scripting 호스트를 통한 Javascript 또는 Powershell과 같은 더 나은 스크립팅 언어를 사용하면 시간이 절약됩니다. 이 중 하나를 사용하면 파일 이름을 읽고 파싱하고 명령을 작성하는 것이 더 쉽거나 적습니다. – theglauber

+0

나는 이것을 위해 VBScript를 확실히 사용할 것입니다. FileSystemObject를 사용하여 스크립트 목록을 가져옵니다. – Ben

+1

'MSQL'이란 무엇입니까? 'MS SQL' 또는'MySQL'? –

답변

0

먼저 작업을 실행해야 할 때 SQL Server 작업 에이전트를 사용해보십시오. 이것은 간단한 일을 계획하는 좋은 방법입니다.

이와 같은 작업을 위해 PowerShell과 "sqlcmd"를 함께 사용하는 것이 좋습니다. 이 명령은 실제로 명령 줄에서 스크립트를 실행할 것이므로 질문에 대한 대답입니다.

그러나 한 단계 더 나아갑니다. 일주일에 한 번 (또는 원하는 시간에 실행되는) 작업을 예약하십시오. 하나의 단계 인 PowerShell 스크립트로 구성되어 있습니까? 그런 다음 디렉토리의 모든 스크립트를 반복하고 이름에서 파일 이름을 추출한 다음 sqlcmd를 사용하여 스크립트를 실행할 수 있습니다. 길을 따라 테이블에서 무엇을하고 있는지 기록하여 오류를 발견 할 수 있습니다.

0

MSQL을 사용하여 SQL을 실행하는 방법에 대해 잘 모릅니다. MSQL에 제공되는 명령 줄 유틸리티를 사용하여 적절한 데이터베이스에 대해 각 스크립트를 실행하는 방법을 찾아야합니다.

올바른 순서로 SQL 파일을 정렬하고 데이터베이스 이름을 구문 분석 할 배치 파일을 사용할 수 있도록 도와 줄 수 있습니다.

시퀀스 번호가 0 인 접두사가 일정한 너비이면 배치 작업이 훨씬 쉽습니다. 나는 그것이 파일의 이름을 바꾸는 것이 옳다고 가정하기 때문에이 솔루션이하는 일입니다.

또한 처리 할 파일이 999 개를 넘지 않을 것이라고 생각했습니다. 더 많은 것을 처리하기 위해 코드를 쉽게 수정할 수 있습니다.

확장이 지연되면 FOR 변수 확장이 손상되므로 파일 이름에 ! 문자가 포함되어 있으면 변경해야합니다. 하지만 그럴 가능성은 희박합니다.

@echo off 
setlocal enableDelayedExpansion 

:: Change the definition to point to the folder that contains the scripts 
set "folder=sqlCodeFolder" 

:: The mask will only match the pattern that you indicated in your question 
set "mask=[*] [*]*.sql" 

:: Rename the .sql files so that the sequence numbers are zero prefixed 
:: to width of 3. This enables the default alpha sort of the directory to be 
:: in the proper sequence 
for /f "tokens=1* delims=[]" %%A in ('dir /b "%folder%\%mask%"') do (
    set seq=00%%A 
    ren "%folder%\[%%A]%%B" "[!seq:~-3!]%%B" 
) 

::Process the renamed files in order 
for %%F in ("%folder%\%mask%") do (
    for /f "tokens=2 delims=[] " %%D in ("%%~nF") do (
    rem %%F contains the full path to the sql file 
    rem %%D contains the name of the database, without enclosing [] 
    rem Replace the echo line below with the proper command to run your script 
    echo run %%F against database [%%D] 
) 
)