Использование osql со скриптами nant

В настоящее время я использую osql с nant, вызывая командный файл с аргументами. Вот свойства, которые определены в моем скрипте nant (нет, не реальные значения имени пользователя / пароля):

<property name="project.config" value="debug" />
<property name="server" value="(local)" />
<property name="database" value="Test" />
<property name="username" value="sa" />
<property name="password" value="password" />

Затем я создаю соединение osql на основе имени пользователя / пароля:

<if test="${username==''}">
  <property name="osql.connection" value="-E" />
</if>
<if test="${username!=''}">
  <property name="osql.connection" value="-U ${username} -P ${password}" />
</if>

Затем я передаю эти значения в мой командный файл:

<exec program="setup.bat">
   <arg value="${server}"/>
   <arg value="${database}" />
   <arg value="${osql.connection}" />
</exec>

Файл setup.bat использует osql для удаления базы данных:

osql -S %1 -d master %3 -Q "IF EXISTS (SELECT * FROM sysdatabases WHERE name = N'%2') DROP DATABASE [%2]"

Это прекрасно работает, если я не передаю имя пользователя / пароль сценарию nant и вместо этого использую встроенную защиту ("-E" для osql). Если я укажу имя пользователя / пароль, тогда скрипт nant просто остановится (как будто он ожидает ввода). Я знаю, что указываю правильное имя пользователя / пароль, поскольку могу войти в диспетчер подключений SQL и удалить базу данных.

Пожалуйста, дайте мне знать, если есть какие-либо предложения о том, что попробовать или альтернативные способы сделать это.

3 ответа

Решение

Вот несколько предложений

  1. Чтобы помочь диагностировать проблему с помощью сценария nant/batch, было бы полезно вывести полную команду osql (из пакетного сценария), которая выполняется. Это, конечно, чтобы убедиться, что osql.connection правильно раскрывается, когда указывается имя пользователя / пароль.
  2. Возможно, есть другие причины, по которым вы используете пакетный скрипт, к которому мы не причастны. Однако, чтобы помочь диагностировать проблему, вы можете использовать задачу exec, непосредственно передавая в качестве программы файл osql.exe. Опять же, это просто, чтобы вынуть пакетный скрипт, чтобы увидеть, работает ли он напрямую с помощью osql.exe. Кроме того, с этим вы сможете выводить всю командную строку перед выполнением, используя задачу echo.
  3. Для совершенно другого подхода вы можете попробовать задачу sql, которая является частью дистрибутива NAntContrib. Много раз, это делает очень хорошую альтернативу osql.exe.

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

Я предполагаю, что%3 расширяется только до "-U".

Вероятно, это может быть решено

SET Server=%1
SET Database=%2
SHIFT 
SHIFT
osql -S %Server% ... %* -Q "...%Database%..."

ИЛИ установите значение свойства для включения двойных кавычек.

Обновление после комментария:

См. Эту статью о том, как удалить кавычки из переменных оболочки и применить к третьему параметру.

Я думаю, что вы, возможно, захотите поэкспериментировать с ORDER ваших параметров... Кажется, я помню, как в прошлом укусил чувствительность OSQL к порядку параметров.

Это все, что у меня есть сейчас... извини.

Другие вопросы по тегам