Это очень странная ситуация, но я просто не могу указать, что я делаю неправильно.
Я выполняю большой набор сценариев SQL (в основном сценариев создания таблиц). Они выполняются через Java, используя sqlcmd
. Вот команда sqlcmd
, которую я использую.
sqlcmd -m 11 -S SERVER -d DB -U USER -P PASS -r0 -i "SCRIPT.sql" 2> "ERRORS.log" 1> NULL
Примечание: Я использую -r0
и перенаправления, чтобы в файл журнала попадали только ошибки. Я выбрасываю все отходы.
Теперь я выполняю эту команду на Java, используя getRuntime.exec()
, вот так.
Runtime.getRuntime().gc();
strCmd = "cmd /c sqlcmd -m 11 -S SERVER -d DB -U USER -P PASS -r0 -i \"SCRIPT.sql\" 2> \"ERRORS.log\" 1> NULL"
Process proc = Runtime.getRuntime().exec(strCmd);
proc.waitFor();
Примечание: Я использую cmd /c
, поэтому команда запускается в своей собственной оболочке и корректно завершается. Кроме того, это помогает немедленно прочитать журнал ошибок, чтобы найти ошибки.
Проблема!
Эта команда отлично работает, когда запускается вручную в командной строке (т. Е. Таблицы создаются по назначению). Однако при выполнении через Java, как показано, сценарии запускаются, и в журналах нет ошибок, исключений и ничего. Но , при проверке в SSMS таблиц там нет!
Где я могу начать отлаживать эту проблему?
ОБНОВЛЕНИЕ: Я МОРОН
Возвращаемое значение из метода getRuntime().exec
равно 1. Оно должно быть 0, что означает нормальное выполнение.
Есть какие-нибудь указатели о том, как это исправить?
ОБНОВЛЕНИЕ 2
Я посмотрел на процесс ErrorStream, и вот что у него есть.
Sqlcmd: ошибка: ошибка при открытии или работе с файлом 2>
(Причина: имя файла, имя каталога или синтаксис метки тома
неправильно).
Похоже, путь, который я прохожу, неверен. Журнал ошибок попадает в каталог моего профиля, который C:\Documents and Settings\my_username
. Имеют ли значение места на пути? Я в любом случае цитирую их дважды!