Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Зум
Guest
Имею файлы с расширением sql. Размер файлов от 4 до 6 мегабайт.
Сами файлы приблизительно вот такой структуры:
USE [BBB];
...
GO
CREATE TABLE [XXX] ... ;
...
GO
INSERT INTO [XXX] ... ;
INSERT INTO [XXX] ... ;
INSERT INTO [XXX] ... ;
GO
То есть создание таблицы и куча INSERT-ов (от 5 тысяч штук и выше) в неё же.
Отправляю скрипты на обработку примерно таким батником:
CALL sql -S %SERVER% -U %USER% -P %PASSWORD% -i "%FILE_NAME%.sql" >> "%LOG_NAME%.log" 2>&1


Проблема - на одной машине всё прекрасно работает, а вот на другой машине таблицы создаются, но они почему-то пустые, никаких ошибок в логе нету.

Кто-то может что-то подсказать?
30 сен 17, 19:35    [20833655]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
flexgen
Member

Откуда:
Сообщений: 598
Зум,

Попробуй использовать  sqlcmd, определи output файл и посмотри что там написано.
30 сен 17, 19:46    [20833666]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4672
Зум
а вот на другой машине таблицы создаются, но они почему-то пустые, никаких ошибок в логе нету.
что мешает руками выполнить t-sql код в ssms от этого вашего %USER% и посмотреть что происходит?
30 сен 17, 19:54    [20833675]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Зум
Guest
Дедушка, SSMS отсутсвует. Хотя да, не подумал, очень логично так сделать, спасибо большое, попробую найти и поставить.

flexgen, Это он и есть, значит дополняю как-то так:
CALL sql -S %SERVER% -U %USER% -P %PASSWORD% -i "%FILE_NAME%.sql" -o "%FILE_NAME%.log" >> "%LOG_NAME%.log" 2>&1
- и смотрю там, спасибо огромное! Сейчас попробуем...
30 сен 17, 20:07    [20833691]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
iap
Member

Откуда: Москва
Сообщений: 44962
Как же можно создавать таблицу без проверки её существования?
Наверняка таблица уже есть -> ошибка -> прерывание выполнения скрипта.
30 сен 17, 21:27    [20833824]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Зум
Guest
В одном из файлов оказалось - ошибка синтаксиса - в настройках какого-то чёрта использовали символ одинарной кавычки, а при сборке скрипта забыли экранировать это. При этом в лог пишется только:
автор
Контекст базы данных изменен на "BBB".
Одна строка. И всё. Ошибок нет.


Другие пишут ошибку:
автор
Контекст базы данных изменен на "BBB".

Поставщик общей памяти: С обоих концов канала отсутствуют процессы.
Ошибка связи
Опытным путём обнаружено, что это спровоцировано слишком большим количеством идущих подряд "INSERT", не отделённых друг от друга "GO"...
Если понатыкать "GO" хотя бы через каждую четверть "INSERT"-ов - уже ошибка пропадает, скрипт отрабатывает весть и корректно...

Наверное стоит потребовать в багтрекере чтоб через каждые 100 "INSERT"-ов вставляли "GO".
1 окт 17, 01:34    [20834043]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4672
Зум
Опытным путём обнаружено, что это спровоцировано слишком большим количеством идущих подряд "INSERT", не отделённых друг от друга "GO".
судя по приведённому вами примеру у вас инсерты в одну таблицу, почему не сделаете один инсерт?
1 окт 17, 02:08    [20834059]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 80
Дедушка
Зум
Опытным путём обнаружено, что это спровоцировано слишком большим количеством идущих подряд "INSERT", не отделённых друг от друга "GO".
судя по приведённому вами примеру у вас инсерты в одну таблицу, почему не сделаете один инсерт?


Один инсерт вроде как имеет ограничение на 1000 значений, но это действительно лучше
1 окт 17, 12:08    [20834281]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
iap
Member

Откуда: Москва
Сообщений: 44962
Alexander Titkin
Дедушка
пропущено...
судя по приведённому вами примеру у вас инсерты в одну таблицу, почему не сделаете один инсерт?


Один инсерт вроде как имеет ограничение на 1000 значений, но это действительно лучше
Тысяча - это если INSERT VALUES(). Да и то это не совсем правда.
Можно, однако, INSERT SELECT UNION ALL SELECT UNION ALL ...
Но отдельные INSERTы надёжнее, ИМХО
1 окт 17, 13:16    [20834386]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 80
iap,

Через union all тоже имеет ограничение) Как-то раз у нас человеку приспичило миллион хешей таким образом залить, через сутки я запрос прибил. Скулю понадобилось очень много времени и памяти для построения плана запроса.
1 окт 17, 15:35    [20834587]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
Зум
Guest
Всё уже украдено до нас Генерация самих скриптов делается без моего участия, я не могу самостоятельно влиять на формат. У меня просто порция готовых файлов.
Мне что, типа регулярки что ли какой натравливать на файлы перед выполнением? Слишком костыльное решение. А если что-то поменяют и регулярка наоборот сломает всё нафик?

Я уже потребовал чтоб при генерации через каждую сотню INSERT шёл GO, так работает на всех машинах и всех имеющихся (у клиентов) версиях MSSQLS.
Правда они вот ответили мол им "проще после каждого INSERT пихать GO, давайте так?"... И я не могу сообразить а как серверу будет лучше по факту...
1 окт 17, 20:50    [20834895]     Ответить | Цитировать Сообщить модератору
 Re: Запускаю файлы *.sql через консоль, часть отрабатывает, честь нет (не срабатывают INSERT)  [new]
iii2
Member

Откуда:
Сообщений: 189
Зум
Всё уже украдено до нас Генерация самих скриптов делается без моего участия, я не могу самостоятельно влиять на формат. У меня просто порция готовых файлов.
Мне что, типа регулярки что ли какой натравливать на файлы перед выполнением? Слишком костыльное решение. А если что-то поменяют и регулярка наоборот сломает всё нафик?

Я уже потребовал чтоб при генерации через каждую сотню INSERT шёл GO, так работает на всех машинах и всех имеющихся (у клиентов) версиях MSSQLS.
Правда они вот ответили мол им "проще после каждого INSERT пихать GO, давайте так?"... И я не могу сообразить а как серверу будет лучше по факту...

А группировать записи по 1000, и делать insert ... values (), () ... () go они не смогут?
Самый оптимальный вариант, ИМХО.
2 окт 17, 15:20    [20836581]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить