Как вы импортируете большой MS SQL файл .sql? - PullRequest
214 голосов
/ 11 января 2009

Я использую сравнение данных RedGate SQL и сгенерировал файл .sql, чтобы я мог запустить его на своей локальной машине. Но проблема в том, что размер файла превышает 300 МБ, что означает, что я не могу копировать и вставлять, потому что буфер обмена не сможет его обработать, и когда я пытаюсь открыть файл в SQL Server Management Studio, я получаю сообщение об ошибке о слишком большом файле.

Есть ли способ запустить большой файл .sql? Файл в основном содержит данные для двух новых таблиц.

Ответы [ 10 ]

398 голосов
/ 11 января 2009

Из командной строки запустите 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] 
55 голосов
/ 14 марта 2013

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

sqlcmd -S [servername] -d [databasename] -i [scriptfilename] -a 32767
19 голосов
/ 25 августа 2015

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

BigSqlRunner

12 голосов
/ 03 июня 2016
  1. Принять командную строку с правами администратора
  2. Перейдите в каталог, где хранится файл .sql
  3. Выполнить следующую команду

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

5 голосов
/ 06 апреля 2017

Я использую 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 голосов
/ 11 января 2009

Запустите его из командной строки с помощью osql, смотрите здесь:

http://metrix.fcny.org/wiki/display/dev/How+to+execute+a+.SQL+script+using+OSQL

1 голос
/ 18 августа 2017

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

sqlcmd -u UserName -s <ServerName\InstanceName> -i U:\<Path>\script.sql
1 голос
/ 11 января 2009

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

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

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

1 голос
/ 11 января 2009

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

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

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

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

0 голосов
/ 08 марта 2019

У меня была похожая проблема. Мой файл со сценарием sql был размером более 150 МБ (с почти 900 КБ очень простых INSERT s). Я использовал решение, рекомендованное Такуро (как ответ в этом вопросе), но я все еще получал сообщение об ошибке, в котором говорилось, что недостаточно памяти («Недостаточно системной памяти в внутреннем пуле ресурсов для выполнения этого запроса»). *

Что мне помогло, так это то, что я ставил команду GO после каждых 50k INSERT s.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...