Я запускаю умеренно большой скрипт (около 900 МБ) с SQLCMD.exe и сталкиваюсь с нечетной ситуацией.
Скрипт состоит из нескольких тысяч операторов вставки. Когда я запускаю его, он некоторое время будет работать нормально, затем в какой-то момент выйдет с ошибкой:
Sqlcmd: ошибка: синтаксическая ошибка в строке _SOME_LINE_NUMBER_ в файле
'D: \ myscript.sql'
.
Теперь проблема в том, что в этом номере строки нет ошибки (или где-либо еще в скрипте). Если я перейду к данной строке и возьму блок операторов, в котором он содержится, он не будет работать в SSMS. Я обычно иду к файлу и усекаю его так, чтобы он начинался с оператора оператора, который не понравился SQLCMD (на самом деле, я запускаю пару операторов раньше него), то есть я удаляю уже запущенный материал. Я запускаю новый файл sql с SQLCMD, и весь процесс повторяется с той же ошибкой, ссылающейся на другую строку (исходная строка, на которую он жаловался, на этот раз не вызывает проблем).
Если я перезапущу сценарий без его редактирования (вырезая уже обработанные части), то при каждом его повторном запуске кажется, что он выходит из строя по одному и тому же номеру строки. Опять же, синтаксическая ошибка фактически отсутствует .
Это пример нескольких тысяч блоков операторов в файле:
DECLARE @tblOutput table (ID int);
BEGIN TRANSACTION
IF NOT EXISTS (SELECT * FROM MyTable WHERE ID=123)
BEGIN
INSERT INTO MyTable(Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9)
OUTPUT INSERTED.ID INTO @tblOutput(ID)
VALUES(1, '2', '3', '4', 5, 6, (SELECT TOP 1 ID FROM SomeOtherTable WHERE Name='Something'), (SELECT TOP 1 ID FROM YetAnotherTable WHERE Name='321'), 9 )
INSERT INTO MyTable2(Col1, Col2, FKID)
VALUES(1, 0, (SELECT TOP 1 ID FROM @tblOutput) )
END
IF NOT EXISTS (SELECT * FROM RelatedTable WHERE stuff='something')
BEGIN
INSERT INTO RelatedTable(Col1, Col2)
VALUES ('test', (SELECT TOP 1 ID FROM @tblOutput) )
END
COMMIT TRANSACTION
DELETE FROM @tblOutput
GO
Запуск SQLCMD.exe следующим образом:
SQLCMD.EXE -S localhost -d mydatabase -V 17 -i dataimport.sql -o dataimport.log
Кто-нибудь может высказать предположение, почему это может происходить? Я подумал, что это может быть связано с памятью (я запускаю это на локальном экземпляре, у которого только 512 МБ выделено для SQL Server), поэтому я увеличил объем доступной памяти до 2 ГБ, но без изменений в результате.
К вашему сведению, это SQL Server 2014, и я запускаю сценарий с параметром -V 17 (что, по-моему, не имеет никакого эффекта, поскольку синтаксическая ошибка имеет достаточно высокий уровень ошибки?).
Заранее спасибо.