SQLCMD.exe, выход с синтаксической ошибкой, где нет синтаксической ошибки - PullRequest
0 голосов
/ 30 октября 2018

Я запускаю умеренно большой скрипт (около 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 (что, по-моему, не имеет никакого эффекта, поскольку синтаксическая ошибка имеет достаточно высокий уровень ошибки?).

Заранее спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Подводя итог из моих комментариев:

Проверьте параметры командной строки , которые вы используете для sqlcmd.exe . Обратите внимание, что параметры чувствительны к регистру. Вы должны быть в состоянии использовать -b -e, чтобы указать sqlcmd прекратить выполнение при обнаружении ошибки, а также отобразить команду, которую он пытается запустить.

Также следует учитывать параметры -x (отключить подстановку переменных) и -X (отключить команды скрипта). Если данные, которые вы вставляете, потенциально содержат данные, которые выглядят как переменная подстановки sqlcmd, $(variable), вам нужно будет указать -x, чтобы отключить эту функцию.

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