C#에서 GO
명령으로 대규모 SQL 스크립트 실행하기
SQL Server를 사용할 때, 테이블, 뷰, 저장 프로시저와 같은 여러 객체를 생성하는 대규모 SQL 스크립트를 자주 접하게 됩니다. 이러한 스크립트는 종종 GO
명령으로 분리되어 있습니다. C# 프로그램에서 이러한 스크립트를 실행하려고 할 경우, SqlCommand.ExecuteNonQuery()
메서드가 GO
명령을 인식하지 못하기 때문에 오류나 SQL 문이 완전히 실행되지 않는 문제가 발생할 수 있습니다.
그렇다면 이 상황을 효과적으로 처리하려면 어떻게 해야 할까요? 프로세스를 간소화할 수 있는 솔루션을 살펴보겠습니다.
문제 이해하기
주요 문제는 C#의 SqlCommand 클래스가 GO
를 배치 구분자로 지원하지 않는다는 것입니다. 각 배치는 서버에 별도로 전송되어야 합니다. GO
명령을 포함한 스크립트를 실행할 때의 단계 요약은 다음과 같습니다:
- 스크립트 준비: SQL 스크립트를 작성하고
GO
로 구분된 여러 문장을 포함해야 합니다. - SQL 명령 실행: 스크립트를 실행하기 위한 명령을 사용합니다. 하지만 전체 스크립트를 직접 실행하면
GO
의 포함으로 인해 오류가 발생합니다. - 배치 실행: 스크립트를
GO
명령 없이 각 배치로 분할하고 하나씩 실행합니다.
하지만 수동으로 스크립트를 분할하는 것은 번거롭고 오류가 발생하기 쉽습니다. 다행히도 더 나은 방법이 있습니다.
더 나은 솔루션: SQL Server 관리 객체(SMO) 사용하기
GO
문이 포함된 대규모 SQL 스크립트를 실행하는 가장 효과적인 방법 중 하나는 SQL Server 관리 객체(SMO)를 사용하는 것입니다. SMO는 GO
구분자를 이해하고 스크립트를 의도한 대로 실행할 수 있습니다.
구현 단계
C# 프로그램에서 이 솔루션을 구현하는 방법은 다음과 같습니다:
-
환경 설정: 프로젝트에 필요한 SMO 라이브러리를 참조합니다. 아직 설치하지 않았다면 NuGet을 통해
Microsoft.SqlServer.SqlManagementObjects
패키지를 설치해야 할 수 있습니다. -
샘플 코드: SMO를 사용하여 SQL 스크립트를 실행하는 샘플 구현입니다:
public static void Main()
{
// SQL 스크립트가 포함된 디렉터리 정의
string scriptDirectory = "c:\\temp\\sqltest\\";
// SQL Server 데이터베이스의 연결 문자열 정의
string sqlConnectionString = "Integrated Security=SSPI;" +
"Persist Security Info=True;Initial Catalog=Northwind;Data Source=(local)";
// 지정된 디렉터리에서 모든 SQL 파일 가져오기
DirectoryInfo di = new DirectoryInfo(scriptDirectory);
FileInfo[] rgFiles = di.GetFiles("*.sql");
// 각 SQL 파일 반복 처리
foreach (FileInfo fi in rgFiles)
{
// SQL 파일의 내용 읽기
string script = File.ReadAllText(fi.FullName);
// 새로운 SQL 연결 생성
using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
// SMO 서버 객체 초기화
Server server = new Server(new ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery(script); // 스크립트 실행
}
}
}
코드 설명
- 스크립트 디렉터리: 변수
scriptDirectory
를 SQL 파일이 저장된 폴더로 변경합니다. - SQL 연결 문자열: 연결 문자열을 데이터베이스 서버 설정에 맞게 수정합니다.
- 파일 작업: 코드는
File.ReadAllText
를 사용하여 각 SQL 파일의 내용을 읽습니다. - SMO 실행:
server.ConnectionContext.ExecuteNonQuery(script)
명령은GO
명령을 올바르게 처리하며 스크립트를 실행합니다.
대안 솔루션
SMO가 프로젝트에 적합하지 않은 경우, 다음을 고려할 수 있습니다:
- Phil Haack의 라이브러리:
GO
구분자가 포함된 SQL 스크립트를 처리하는 데 유용한 라이브러리입니다. 구현 세부사항은 그의 블로그 게시물을 여기에서 확인하세요.
결론
GO
명령이 포함된 대규모 SQL 스크립트를 실행하는 것은 번거로울 필요가 없습니다. SQL Server 관리 객체(SMO)를 활용함으로써 수동으로 명령을 분할하는 번거로움 없이 구조화된 방식으로 스크립트를 원활하게 실행할 수 있습니다. 이 접근법은 시간을 절약할 뿐만 아니라 실행 중 오류 발생 가능성도 감소시킵니다.
최상의 결과를 위해 환경이 올바르게 설정되었는지 확인하고, C# 애플리케이션에서 더 원활한 SQL 실행 경험을 즐기세요.