Как вы импортируете большой MS SQL файл .sql?


240

Я использую RedGate SQL для сравнения данных и генерирую файл .sql, чтобы я мог запустить его на своей локальной машине. Но проблема в том, что размер файла превышает 300 МБ, что означает, что я не могу копировать и вставлять, потому что буфер обмена не сможет с этим справиться, и когда я пытаюсь открыть файл в 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'). У меня ошибка с кавычками. Так что я должен использовать (какой параметр) для обработки этой ошибки? Спасибо
Александр Фенцык

1
Можем ли мы сохранить скрипт на внешнем диске? Как E: диск? вместо диска С?
Ани

10
Просто подтверждая, что я только что запустил файл 1 ГБ sql с помощью этой команды
Loupax

11
Это сработало для меня, но мне пришлось избавиться от -o в конце
bunggo

2
не удалось запустить файл 75G sql.
Аладдин

62

У меня была точно такая же проблема, и я некоторое время боролся, а потом наконец нашел решение, которое заключается в установке -aпараметра в значение sqlcmd, чтобы изменить размер пакета по умолчанию:

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

4
+1 за добавление опции -d в примере. Я использовал «USE [DBNAME]» в моем файле sql. Это тоже сработало. Не уверен, какой метод лучше или предпочтительнее
Shaakir

3
Спасибо. Я использовал следующую команду в качестве имени пользователя и пароля, необходимых для подключения к базе данных. sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Хрижу

1
Какую проблему вы решили, установив размер пакета? Microsoft говорит: «Больший размер пакета может повысить производительность ...» ( docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
Невероятный январь

20

Вы также можете использовать этот инструмент. Это действительно полезно.

BigSqlRunner


Я думал, что это также было полезно, пока я не запустил его с файлом SQL 400 МБ (полным операторов INSERT). После 9 часов работы ничего не было добавлено в базу данных, но BigSqlRunner занимал от 3 до 6 ГБ памяти.
Мартейн

Очень полезно. Обычно я вручную разделяю файл (различные инструменты) на куски, затем вручную редактирую их так, чтобы операторы sql были «целыми», а затем выполнялся с помощью пакетного сценария. Это делает это так легко. 2.3 ГБ .SQL файл, легко.
Барри

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. Так как мне нужно было запустить только один сценарий со множеством простых операторов вставки, я обошел его, написав небольшое консольное приложение в качестве крайней меры:

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 был более 150 МБ (почти 900 КБ очень простых INSERT ). Я использовал решение, рекомендованное Такуро (в качестве ответа в этом вопросе), но я все еще получал сообщение об ошибке, в котором говорилось, что недостаточно памяти («Недостаточно системной памяти в внутреннем пуле ресурсов для выполнения этого запроса»).

Мне помогло то, что я ставлю команду GO после каждых 50 тыс. INSERT .

(Это не относится непосредственно к вопросу (размер файла), но я считаю, что это решает проблему, которая косвенно связана с большим размером самого сценария SQL. В моем случае много команд вставки)


1

Ваш вопрос очень похож на этот

Вы можете сохранить свой файл / скрипт как .txt или .sql и запустить его из Sql Server Management Studio (я думаю, что меню Open / Query, а затем просто выполнить запрос в интерфейсе SSMS). Возможно, вам придется обновить первую строку, указав базу данных, которая будет создана или выбрана на вашем локальном компьютере.

Если вам приходится выполнять эту передачу данных очень часто, вы можете перейти к репликации. В зависимости от ваших потребностей, репликация снимков может быть в порядке. Если вам нужно синхронизировать данные между двумя серверами, вы можете использовать более сложную модель, такую ​​как репликация слиянием.

РЕДАКТИРОВАТЬ: я не заметил, что у вас были проблемы с SSMS, связанные с размером файла. Затем вы можете перейти к командной строке, предложенной другими, репликации моментальных снимков (опубликовать на главном сервере, подписаться на локальный, реплицировать, затем отписаться) или даже выполнить резервное копирование / восстановление.


3
Джек упомянул, что он не может сделать это из SSMS, поскольку файл слишком большой.
Рэй Бойсен

1

Файл в основном содержит данные для двух новых таблиц.

Тогда вам может быть проще просто DTS (или SSIS, если это SQL Server 2005+) передавать данные, если два сервера находятся в одной сети.

Если два сервера не находятся в одной сети, вы можете сделать резервную копию исходной базы данных и восстановить ее в новой базе данных на конечном сервере. Затем вы можете использовать DTS / SSIS или даже просто INSERT INTO SELECT, чтобы перенести две таблицы в базу данных назначения.


Если одна или две таблицы генерируют такой большой файл, можно с уверенностью предположить, что БД - это пара гигабайт, что делает невозможным резервное копирование и восстановление во многих случаях.
Капитан Кенпачи

1

Надеюсь, это поможет вам!

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

1
-U <имя пользователя> -P <пароль> Опции команд должны быть в верхнем регистре, а не в нижнем регистре
eric xu

0

Я столкнулся с той же проблемой и потратил целый день, чтобы найти выход, но это решается созданием копии файла .sql, изменением расширения на файл .txt и открытием файла .txt в браузере Chrome. Я видел магию и файл открывается в браузере.

Спасибо и всего наилучшего,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.