큰 MS SQL .sql 파일을 어떻게 가져 옵니까?


240

RedGate SQL 데이터 비교를 사용하고 .sql 파일을 생성하여 로컬 컴퓨터에서 실행할 수있었습니다. 그러나 문제는 파일의 크기가 300MB를 넘기 때문에 클립 보드에서 파일을 처리 할 수 ​​없기 때문에 복사하여 붙여 넣을 수 없으며 SQL Server Management Studio에서 파일을 열려고하면 오류가 발생한다는 것입니다 파일이 너무 큽니다.

큰 .sql 파일을 실행하는 방법이 있습니까? 파일에는 기본적으로 두 개의 새 테이블에 대한 데이터가 포함됩니다.

답변:


442

명령 프롬프트에서 다음을 시작하십시오 sqlcmd.

sqlcmd -S <server> -i C:\<your file here>.sql 

그냥 교체 <server>하여 SQL 상자의 위치 및 <your file here>스크립트의 이름으로. SQL 인스턴스를 사용하는 경우 구문은 다음과 같습니다.

sqlcmd -S <server>\instance.

sqlcmd를 전달할 수있는 모든 인수 목록은 다음과 같습니다.

Sqlcmd            [-U login id]          [-P password]
  [-S server]            [-H hostname]          [-E trusted connection]
  [-d use database name] [-l login timeout]     [-t query timeout] 
  [-h headers]           [-s colseparator]      [-w screen width]
  [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
  [-c cmdend]            [-L[c] list servers[clean output]]
  [-q "cmdline query"]   [-Q "cmdline query" and exit] 
  [-m errorlevel]        [-V severitylevel]     [-W remove trailing spaces]
  [-u unicode output]    [-r[0|1] msgs to stderr]
  [-i inputfile]         [-o outputfile]        [-z new password]
  [-f  | i:[,o:]] [-Z new password and exit] 
  [-k[1|2] remove[replace] control characters]
  [-y variable length type display width]
  [-Y fixed length type display width]
  [-p[1] print statistics[colon format]]
  [-R use client regional setting]
  [-b On error batch abort]
  [-v var = "value"...]  [-A dedicated admin connection]
  [-X[1] disable commands, startup script, environment variables [and exit]]
  [-x disable variable substitution]
  [-? show syntax summary] 

1
다음과 같은 삽입물이 INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text')있습니다. 따옴표에 오류가 있습니다. 그래서이 오류를 처리하기 위해 어떤 매개 변수를 사용해야합니까? 감사합니다
Oleksandr Fentsyk

1
스크립트를 외장 드라이브에 보관할 수 있습니까? E처럼 : 드라이브? C 드라이브 대신?
Ani

10
방금이 명령을 사용하여 1GB sql 파일을 실행했음을 확인했습니다
Loupax

11
이것은 나를 위해 일한,하지만 난 마지막에 -o 제거했다
bunggo

2
75G SQL 파일을 실행하지 못했습니다.
알라딘

62

나는 정확히 같은 문제가 있었고 잠시 동안 고투하고 있었고 마침내 기본 패킷 크기를 변경하기 위해 -a매개 변수를 설정하는 솔루션을 찾았습니다 sqlcmd.

sqlcmd -S [servername] -d [databasename] -i [scriptfilename] -a 32767

4
예제에서 -d 옵션을 추가하려면 +1입니다. 내 SQL 파일에서 "USE [DBNAME]"을 사용했습니다. 이것도 효과가있었습니다. 어느 것이 더 낫거나 선호되는지 잘
모르겠습니다

3
감사. 데이터베이스에 연결하는 데 필요한 사용자 이름과 비밀번호로 다음 명령을 사용했습니다. sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Hriju

1
패킷 크기를 설정하여 어떤 문제를 해결 했습니까? 마이크로 소프트는 말한다 : ( "더 큰 패킷 크기가 성능 ... 향상시킬 수 있습니다" docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
놀라운 월

20

이 도구도 사용할 수 있습니다. 정말 유용합니다.

BigSqlRunner


400MB SQL 파일 (INSERT 문으로 가득 찬)으로 실행할 때까지 유용하다고 생각했습니다. 9 시간 동안 실행 한 후에는 데이터베이스에 아무것도 추가되지 않았지만 BigSqlRunner는 3GB에서 6GB의 메모리를 소비했습니다.
Martijn

굉장히 유용하다. 일반적으로 파일 (다양한 도구)을 청크로 분할 한 다음 sql 문이 "전체"가되도록 일괄 편집 한 다음 배치 스크립트를 통해 실행하십시오. 이것은 그렇게 쉽게 만듭니다. 2.3GB .sql 파일로 쉽게 사용할 수 있습니다.
Barry

14
  1. 관리자 권한으로 명령 프롬프트 수행

  2. .sql 파일이 저장된 디렉토리로 변경하십시오.

  3. 다음 명령을 실행하십시오

    sqlcmd -S 'your server name' -U 'user name of server' -P 'password of server' -d 'db name'-i script.sql


7

MSSQL Express 2014를 사용하고 있는데 어떤 솔루션도 도움이되지 않았습니다. 그들은 모두 방금 SQL을 추락했습니다. 많은 간단한 insert 문으로 스크립트실행하기 만하면되었으므로 마지막 수단으로 작은 콘솔 응용 프로그램을 작성하여 해결했습니다.

class Program
{
    static void Main(string[] args)
    {
        RunScript();
    }

    private static void RunScript()
    {
        My_DataEntities db = new My_DataEntities();

        string line;

        System.IO.StreamReader file =
           new System.IO.StreamReader("c:\\ukpostcodesmssql.sql");
        while ((line = file.ReadLine()) != null)
        {
            db.Database.ExecuteSqlCommand(line);
        }

        file.Close();
    }
}


2

나는 비슷한 문제가 있었다. SQL 스크립트가있는 내 파일의 크기는 150MB 이상입니다 (거의 900k의 매우 간단한 INSERT 포함 ). Takuro가 조언 한 솔루션을 사용했지만 (이 질문에 대한 답변으로) 메모리가 충분하지 않다는 메시지가 계속 표시됩니다 ( "이 쿼리를 실행하기 위해 리소스 풀 '내부'에 시스템 메모리가 부족합니다").

내가 도움이 된 것은 50k INSERT 마다 GO 명령을 넣는 것 입니다.

(질문 (파일 크기)을 직접 다루지는 않지만 큰 크기의 SQL 스크립트 자체와 간접적으로 연결된 문제를 해결한다고 생각합니다. 많은 경우 삽입 명령)


1

귀하의 질문은 이것 과 매우 유사합니다

파일 / 스크립트를 .txt 또는 .sql로 저장하고 Sql Server Management Studio에서 실행할 수 있습니다 (메뉴는 Open / Query라고 생각한 다음 SSMS 인터페이스에서 쿼리를 실행하십시오). 첫 번째 줄을 업데이트하여 로컬 컴퓨터에서 만들거나 선택할 데이터베이스를 나타냅니다.

이 데이터 전송을 자주 수행해야하는 경우 복제를 수행 할 수 있습니다. 필요에 따라 스냅 샷 복제가 정상일 수 있습니다. 두 서버간에 데이터를 동기화해야하는 경우 병합 복제와 같은보다 복잡한 모델을 사용할 수 있습니다.

편집 : 파일 크기에 연결된 SSMS에 문제가 있음을 알지 못했습니다. 그런 다음 다른 사람들이 제안한대로 스냅 샷 복제 (주 서버에 게시, 로컬 서버에 가입, 복제, 구독 취소) 또는 백업 / 복원 명령 줄을 사용할 수 있습니다.


3
Jack은 파일이 너무 커서 SSMS에서 할 수 없다고 언급했습니다.
Ray Booysen

1

파일에는 기본적으로 두 개의 새 테이블에 대한 데이터가 포함됩니다.

그러면 두 서버가 동일한 네트워크에있는 경우 DTS (또는 SQL Server 2005+ 인 경우 SSIS)로 데이터를 보내는 것이 더 간단 할 수 있습니다.

두 서버가 동일한 네트워크에 있지 않으면 소스 데이터베이스를 백업하고 대상 서버의 새 데이터베이스로 복원 할 수 있습니다. 그런 다음 DTS / SSIS 또는 간단한 INSERT INTO SELECT을 사용하여 두 테이블을 대상 데이터베이스로 전송할 수 있습니다.


하나 또는 두 개의 테이블이 큰 파일을 생성하는 경우, DB가 몇 개의 Gigs라고 가정하는 것이 안전하므로 많은 경우 백업 및 복원이 불가능합니다.
켄 파치 선장

1

이것이 당신을 돕기를 바랍니다!

sqlcmd -u UserName -s <ServerName\InstanceName> -i U:\<Path>\script.sql

1
-U <username> -P <password> 옵션 명령은 대문자가 소문자가 아니어야합니다.
eric xu

0

나는 같은 문제가 발생하여 길을 찾기 위해 하루 종일 투자했지만 .sql 파일의 사본을 만들고 확장자를 .txt 파일로 변경하고 .txt 파일을 크롬 브라우저로 열어서 해결됩니다. 마법과 파일이 브라우저에서 열리는 것을 보았습니다.

감사와 안부

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.