Jak zaimportować duży plik .sql MS SQL?

240

Korzystam z porównania danych RedGate SQL i wygenerowałem plik .sql, dzięki czemu mogłem go uruchomić na moim komputerze lokalnym. Problem polega jednak na tym, że rozmiar pliku przekracza 300 MB, co oznacza, że ​​nie mogę kopiować i wklejać, ponieważ schowek nie będzie w stanie go obsłużyć, a gdy próbuję otworzyć plik w SQL Server Management Studio, pojawia się błąd o zbyt dużym pliku.

Czy istnieje sposób na uruchomienie dużego pliku .sql? Plik zasadniczo zawiera dane dla dwóch nowych tabel.

Jacek
źródło

Odpowiedzi:

442

W wierszu polecenia uruchom sqlcmd:

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

Wystarczy zastąpić <server>lokalizacją swojego pola SQL i <your file here>nazwą skryptu. Nie zapomnij, jeśli używasz instancji SQL, składnia jest następująca:

sqlcmd -S <server>\instance.

Oto lista wszystkich argumentów, które możesz przekazać 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] 
Ray Booysen
źródło
1
Mam wkładkę takiego: INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text'). Mam błąd w cytatach. SO Czego muszę użyć (który parametr) do obsługi tego błędu? Dzięki
Oleksandr Fentsyk
1
Czy możemy przechowywać skrypt na dysku zewnętrznym? Jak E: dysk? zamiast dysku C?
Ani
10
Potwierdzam, że właśnie uruchomiłem plik 1GB sql za pomocą tego polecenia
Loupax
11
To działało dla mnie, ale musiałem pozbyć się -o na końcu
bunggo
2
nie udało się uruchomić pliku 75G sql.
Aladdin
62

Miałem dokładnie ten sam problem i walczyłem przez jakiś czas, a potem w końcu znalazłem rozwiązanie polegające na ustawieniu -aparametru na sqlcmdw celu zmiany domyślnego rozmiaru pakietu:

sqlcmd -S [servername] -d [databasename] -i [scriptfilename] -a 32767
Takuro
źródło
4
+1 za dodanie opcji -d w przykładzie. Użyłem „USE [DBNAME]” w moim pliku SQL. To też działało. Nie jestem pewien, która metoda jest lepsza lub preferowana
Shaakir
3
Dzięki. Użyłem następującego polecenia jako nazwy użytkownika i hasła wymaganego do połączenia z bazą danych. sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Hriju
1
Który problem rozwiązałeś, ustawiając rozmiar pakietu? Microsoft mówi: „Większy rozmiar pakietu może zwiększyć wydajność ...” ( docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
niesamowity
20

Możesz także użyć tego narzędzia. To jest naprawdę przydatne.

BigSqlRunner

Yigit Yuksel
źródło
Myślałem, że to też jest przydatne, dopóki nie uruchomiłem go z 400 MB plikiem SQL (pełnym instrukcji INSERT). Po 9 godzinach działania nic nie zostało dodane do bazy danych, ale BigSqlRunner zużywał od 3 GB do 6 GB pamięci.
Martijn
Bardzo przydatne. Zwykle ręcznie dzielę plik (różne narzędzia) na części, a następnie ręcznie je edytuję, aby instrukcje sql były „całe”, a następnie uruchamiane za pomocą skryptu wsadowego. To sprawia, że ​​tak łatwo. Plik .sql 2,3 GB, łatwy.
Barry
14
  1. Weź wiersz polecenia z uprawnieniami administratora

  2. Przejdź do katalogu, w którym znajduje się plik .sql

  3. Wykonaj następujące polecenie

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

Syam Kumar
źródło
7

Korzystam z MSSQL Express 2014 i żadne z rozwiązań nie zadziałało. Wszyscy po prostu rozbili SQL. Ponieważ wystarczyło mi tylko uruchomić skrypt jednorazowy z wieloma prostymi instrukcjami wstawiania, obejrzałem go, pisząc małą aplikację konsolową w ostateczności:

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();
    }
}
Animus Miles-Militis
źródło
2

Miałem podobny problem. Mój plik SQL skryptu było ponad 150MB wielkości (prawie 900K bardzo proste INSERT s). Użyłem rozwiązania zalecanego przez Takuro (jako odpowiedź w tym pytaniu), ale nadal pojawia się błąd z komunikatem informującym, że nie ma wystarczającej ilości pamięci („Brak wystarczającej pamięci systemowej w puli zasobów„ wewnętrznej ”do uruchomienia tego zapytania”).

Pomogło mi to, że wstawiałem polecenie GO po każdych 50 000 WSTAWEK .

(Nie odnosi się bezpośrednio do pytania (rozmiaru pliku), ale uważam, że rozwiązuje problem pośrednio związany z dużym rozmiarem samego skryptu sql. W moim przypadku wiele poleceń wstawiania)

Bronek
źródło
1

Twoje pytanie jest bardzo podobne do tego

Możesz zapisać plik / skrypt jako .txt lub .sql i uruchomić go z Sql Server Management Studio (myślę, że menu to Open / Query, a następnie po prostu uruchom zapytanie w interfejsie SSMS). Możesz zaktualizować pierwszy wiersz, wskazując bazę danych, która ma zostać utworzona lub wybrana na komputerze lokalnym.

Jeśli musisz często przesyłać dane, możesz przejść do replikacji. W zależności od potrzeb replikacja migawki może być w porządku. Jeśli musisz zsynchronizować dane między dwoma serwerami, możesz wybrać bardziej złożony model, na przykład replikację scalającą.

EDYCJA: Nie zauważyłem, że masz problemy z SSMS związane z rozmiarem pliku. Następnie możesz przejść do wiersza poleceń, zgodnie z propozycją innych, replikacji migawek (opublikuj na głównym serwerze, subskrybuj na lokalnym, replikuj, a następnie anuluj subskrypcję) lub nawet wykonaj kopię zapasową / przywróć

Philippe Grondier
źródło
3
Jack wspomniał, że nie może tego zrobić z SSMS, ponieważ plik jest zbyt duży.
Ray Booysen
1

Plik zasadniczo zawiera dane dla dwóch nowych tabel.

Wtedy może okazać się łatwiejsze po prostu DTS (lub SSIS, jeśli jest to SQL Server 2005+) przesyłanie danych, jeśli dwa serwery są w tej samej sieci.

Jeśli dwa serwery nie są w tej samej sieci, możesz wykonać kopię zapasową źródłowej bazy danych i przywrócić ją do nowej bazy danych na serwerze docelowym. Następnie możesz użyć DTS / SSIS lub nawet zwykłego INSERT INTO SELECT, aby przenieść dwie tabele do docelowej bazy danych.

P Tatusiu
źródło
Jeśli jedna lub dwie tabele generują tak duży plik, można bezpiecznie założyć, że DB to kilka Gigs, co w wielu przypadkach uniemożliwia tworzenie kopii zapasowych i przywracanie.
Kapitan Kenpachi,
1

Mam nadzieję, że ci to pomoże!

sqlcmd -u UserName -s <ServerName\InstanceName> -i U:\<Path>\script.sql
ortegatorres 10
źródło
1
-U <nazwa użytkownika> -P <hasło> Polecenia opcji powinny być pisane wielkimi, a nie małymi literami
eric xu
0

Zetknąłem się z tym samym problemem i zainwestowałem cały dzień, aby znaleźć wyjście, ale problem można rozwiązać, tworząc kopię pliku .sql i zmieniając rozszerzenie na plik .txt i otwierając plik .txt w przeglądarce Chrome. Widziałem magię i plik otwiera się w przeglądarce.

Dziękuję i pozdrawiam,

hussainsaboor
źródło