Come si importa un file .sql MS SQL di grandi dimensioni?


240

Uso il confronto di dati RedGate SQL e ho generato un file .sql, in modo da poterlo eseguire sul mio computer locale. Ma il problema è che il file è oltre 300mb, il che significa che non posso fare copia e incolla perché gli Appunti non saranno in grado di gestirlo e quando provo ad aprire il file in SQL Server Management Studio ricevo un errore sul file troppo grande.

C'è un modo per eseguire un file .sql di grandi dimensioni? Il file contiene sostanzialmente i dati per due nuove tabelle.

Risposte:


442

Dal prompt dei comandi, avviare sqlcmd:

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

Sostituisci semplicemente <server>con la posizione della tua casella SQL e <your file here>con il nome dello script. Non dimenticare, se stai usando un'istanza SQL la sintassi è:

sqlcmd -S <server>\instance.

Ecco l'elenco di tutti gli argomenti a cui puoi passare 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
Ho qualche inserto come: INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text'). Ho un errore con le virgolette. Quindi cosa devo usare (quale parametro) per gestire questo errore? Grazie
Oleksandr Fentsyk il

1
Possiamo mantenere lo script su disco esterno? Come E: guidare? invece di C drive?
Ani,

10
Sto solo confermando che ho appena eseguito un file sql da 1 GB usando questo comando
Loupax

11
Questo ha funzionato per me, ma alla fine ho dovuto sbarazzarmi di -o
bunggo,

2
impossibile eseguire il file sql 75G.
Aladdin,

62

Ho avuto esattamente lo stesso problema e avevo lottato per un po ', poi finalmente ho trovato la soluzione che è quella di impostare il -aparametro su al sqlcmdfine di modificare la dimensione del pacchetto predefinito:

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

4
+1 per l'aggiunta dell'opzione -d nell'esempio. Ho usato "USE [DBNAME]" nel mio file sql. Anche questo ha funzionato. Non sono sicuro di quale sia il metodo migliore o preferito
Shaakir,

3
Grazie. Ho usato il seguente comando come nome utente e password richiesti per connettermi al database. sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Hriju,

1
Quale problema hai risolto impostando la dimensione del pacchetto? Microsoft afferma: "Una dimensione del pacchetto più grande può migliorare le prestazioni ..." ( docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
L'incredibile

20

Puoi usare anche questo strumento. È davvero utile.

BigSqlRunner


Ho pensato che fosse utile, fino a quando non l'ho eseguito con un file SQL da 400 MB (pieno di istruzioni INSERT). Dopo aver funzionato per 9 ore, nulla era stato aggiunto al database, ma BigSqlRunner consumava tra 3 GB e 6 GB di memoria.
Martijn,

Molto utile. Di solito divido manualmente il file (vari strumenti) in blocchi, quindi li modifico manualmente in modo che le istruzioni sql siano "intere", quindi eseguo tramite uno script batch. Questo lo rende così facile. 2.3gb .sql file, facile.
Barry,

14
  1. Prendi il prompt dei comandi con privilegio di amministratore

  2. Passare alla directory in cui è stato archiviato il file .sql

  3. Eseguire il comando seguente

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


7

Sto usando MSSQL Express 2014 e nessuna delle soluzioni ha funzionato per me. Hanno appena bloccato SQL. Dato che avevo solo bisogno di eseguire uno script unico con molte semplici istruzioni insert, ci sono riuscito scrivendo una piccola app console come ultima risorsa:

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

Ho avuto un problema simile. Il mio file con sql script aveva dimensioni superiori a 150 MB (con quasi 900k di INSERT molto semplici ). Ho usato la soluzione consigliata da Takuro (come risposta in questa domanda) ma ho ancora ricevuto un errore nel messaggio che diceva che non c'era memoria sufficiente ("Memoria di sistema insufficiente nel pool di risorse" interna "per eseguire questa query").

Ciò che mi ha aiutato è stato che ho inserito il comando GO dopo ogni 50k INSERT .

(Non sta affrontando direttamente la domanda (dimensione del file) ma credo che risolva il problema che è indirettamente collegato con una grande dimensione dello script sql stesso. Nel mio caso molti comandi di inserimento)


1

La tua domanda è abbastanza simile a questa

Puoi salvare il tuo file / script come .txt o .sql ed eseguirlo da SQL Server Management Studio (penso che il menu sia Apri / Query, quindi esegui la query nell'interfaccia SSMS). Potrebbe essere necessario aggiornare la prima riga, indicando il database da creare o selezionare sul computer locale.

Se è necessario eseguire questo trasferimento di dati molto spesso, è possibile eseguire la replica. A seconda delle esigenze, la replica dell'istantanea potrebbe essere ok. Se devi sincronizzare i dati tra i tuoi due server, potresti scegliere un modello più complesso come la replica di tipo merge.

EDIT: Non ho notato che hai avuto problemi con SSMS collegati alla dimensione del file. Quindi puoi scegliere la riga di comando, come proposto da altri, la replica di istantanee (pubblicare sul tuo server principale, iscriverti su quello locale, replicare, quindi annullare l'iscrizione) o persino eseguire il backup / ripristino


3
Jack ha detto che non può farlo da SSMS poiché il file è troppo grande.
Ray Booysen,

1

Il file contiene fondamentalmente dati per due nuove tabelle.

Quindi potresti trovare più semplice solo DTS (o SSIS, se si tratta di SQL Server 2005+) i dati, se i due server si trovano sulla stessa rete.

Se i due server non si trovano sulla stessa rete, è possibile eseguire il backup del database di origine e ripristinarlo in un nuovo database sul server di destinazione. Quindi è possibile utilizzare DTS / SSIS, o anche un semplice INSERT INTO SELECT, per trasferire le due tabelle nel database di destinazione.


Se una o due tabelle generano un file così grande, è lecito ritenere che il DB sia un paio di concerti, il che rende in molti casi impossibile il backup e il ripristino.
Capitano Kenpachi,

1

Spero che questo ti aiuti!

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

1
-U <nomeutente> -P <password> I comandi di opzione devono essere maiuscoli e minuscoli
eric xu,

0

Ho riscontrato lo stesso problema e ho investito un'intera giornata per trovare la via d'uscita, ma questo si risolve facendo la copia del file .sql e cambiando l'estensione in file .txt e aprendo il file .txt nel browser Chrome. Ho visto la magia e il file viene aperto in un browser.

Grazie e distinti saluti,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.