Como você importa um arquivo .sql grande do MS SQL?


240

Eu uso os dados SQL do RedGate, comparando e gerando um arquivo .sql, para que eu possa executá-lo na minha máquina local. Mas o problema é que o arquivo tem mais de 300mb, o que significa que não posso copiar e colar porque a área de transferência não conseguirá lidar com isso e, quando tento abrir o arquivo no SQL Server Management Studio, recebo um erro sobre o arquivo ser muito grande.

Existe uma maneira de executar um arquivo .sql grande? O arquivo basicamente contém dados para duas novas tabelas.

Respostas:


442

No prompt de comando, inicie sqlcmd:

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

Apenas substitua <server>pela localização da sua caixa SQL e <your file here>pelo nome do seu script. Não se esqueça, se você estiver usando uma instância SQL, a sintaxe é:

sqlcmd -S <server>\instance.

Aqui está a lista de todos os argumentos que você pode transmitir ao 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
Eu tenho alguma inserção como: INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text'). Estou com erro entre aspas. SO O que eu tenho que usar (qual parâmetro) para lidar com esse erro? Obrigado
Oleksandr Fentsyk

1
Podemos manter o script na unidade externa? Como E: dirigir? em vez de unidade C?
Ani

10
Apenas confirmando que eu corri um arquivo sql 1GB usando este comando
Loupax

11
Isso funcionou para mim, mas eu tinha de se livrar da -o no final
bunggo

2
falhou ao executar o arquivo 75G sql.
Aladdin

62

Eu tinha exatamente o mesmo problema e estava lutando por um tempo e finalmente encontrei a solução que é definir o -aparâmetro sqlcmdpara alterar o tamanho do pacote padrão:

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

4
+1 para adicionar a opção -d no exemplo. Eu usei o "USE [DBNAME]" no meu arquivo sql. Isso funcionou também. Não tenho certeza que é o melhor método ou preferencial
Shaakir

3
Obrigado. Usei o seguinte comando como nome de usuário e senha necessários para conectar-se ao banco de dados. sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Hriju

1
Qual problema você resolveu definindo o tamanho do pacote? A Microsoft diz: "Um tamanho de pacote maior pode melhorar o desempenho ..." ( docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
O incrível dia

20

Você também pode usar esta ferramenta. Isso é realmente útil.

BigSqlRunner


Eu pensei que era útil também, até executá-lo com um arquivo SQL de 400 MB (cheio de instruções INSERT). Após 9 horas de execução, nada foi adicionado ao banco de dados, mas o BigSqlRunner estava consumindo entre 3 GB e 6 GB de memória.
Martijn

Muito útil. Normalmente, eu divido manualmente o arquivo (várias ferramentas) em pedaços, depois os edito manualmente para que as instruções sql sejam "inteiras" e depois as executo por meio de um script em lote. Isso torna tão fácil. Arquivo .sql de 2,3 gb, fácil.
Barry

14
  1. Tome o prompt de comando com privilégio de administrador

  2. Mude o diretório para onde o arquivo .sql está armazenado

  3. Execute o seguinte comando

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


7

Estou usando o MSSQL Express 2014 e nenhuma das soluções funcionou para mim. Todos eles travaram o SQL. Como eu só precisava executar um script único com muitas instruções de inserção simples, resolvi escrever um pequeno aplicativo de console como último recurso:

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

Eu tive um problema semelhante. Meu arquivo com script sql tinha mais de 150 MB de tamanho (com quase 900k de INSERT muito simples ). Usei a solução recomendada por Takuro (como a resposta nesta pergunta), mas ainda assim recebi um erro com a mensagem dizendo que não havia memória suficiente ("Não há memória suficiente no sistema no pool de recursos 'interno' para executar esta consulta").

O que me ajudou foi que eu colocava o comando GO após cada 50k INSERT .

(Não está endereçando diretamente a pergunta (tamanho do arquivo), mas acredito que resolve o problema que está indiretamente conectado ao tamanho grande do próprio script sql. No meu caso, muitos comandos de inserção)


1

Sua pergunta é bem parecida com essa

Você pode salvar seu arquivo / script como .txt ou .sql e executá-lo no Sql Server Management Studio (acho que o menu é Open / Query, execute a consulta na interface do SSMS). Você deve atualizar a primeira linha, indicando o banco de dados a ser criado ou selecionado em sua máquina local.

Se você precisar fazer essa transferência de dados com muita frequência, poderá optar pela replicação. Dependendo das suas necessidades, a replicação de instantâneo pode estar ok. Se você precisar sincronizar os dados entre seus dois servidores, poderá optar por um modelo mais complexo, como a replicação de mesclagem.

EDIT: Não notei que você tinha problemas com o SSMS vinculado ao tamanho do arquivo. Em seguida, você pode optar pela linha de comando, conforme proposto por outras pessoas, replicação de instantâneo (publicar no servidor principal, inscrever-se no servidor local, replicar e cancelar a inscrição) ou até mesmo fazer backup / restauração


3
Jack mencionou que não pode fazê-lo no SSMS, pois o arquivo é muito grande.
Ray Booysen

1

O arquivo basicamente contém dados para duas novas tabelas.

Em seguida, você pode achar mais simples apenas DTS (ou SSIS, se for o SQL Server 2005 ou superior) os dados, se os dois servidores estiverem na mesma rede.

Se os dois servidores não estiverem na mesma rede, você poderá fazer backup do banco de dados de origem e restaurá-lo para um novo banco de dados no servidor de destino. Em seguida, você pode usar o DTS / SSIS, ou mesmo um simples INSERT INTO SELECT, para transferir as duas tabelas para o banco de dados de destino.


Se uma ou duas tabelas gerarem um arquivo tão grande, é seguro supor que o banco de dados seja um par de Gigs, o que torna o backup e a restauração inviáveis ​​em muitos casos.
Capitão Kenpachi

1

Espero que isso ajude você!

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

1
-U <nome de usuário> -P <senha> comandos opção deve ser maiúsculas caso não menor
Eric Xu

0

Encontrei o mesmo problema e investi um dia inteiro para encontrar a saída, mas isso foi resolvido fazendo a cópia do arquivo .sql e alterando a extensão para o arquivo .txt e abra o arquivo .txt no navegador Chrome. Eu vi a mágica e o arquivo é aberto em um navegador.

Obrigado e cumprimentos,

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.