使用osql和nant脚本

时间:2008-11-21 14:57:16

标签: nant osql

我目前正在通过调用带参数的批处理文件来使用osnt和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 个答案:

答案 0 :(得分:2)

以下是一些建议

  1. 为了帮助诊断nant / batch脚本的问题,回显出正在执行的完整osql命令(来自批处理脚本)会很有帮助。这当然是为了确保在提供用户名/传递时正确扩展osql.connection。
  2. 您可能还有其他原因使用我们不知情的批处理脚本。但是,为了帮助诊断问题,您可以使用exec任务直接传入osql.exe作为程序。同样,这只是取出批处理脚本以查看它是否可以直接使用osql.exe。此外,使用echo任务,您将能够在执行之前回显整个命令字符串。
  3. 对于完全不同的方法,您可以尝试作为sql发行版一部分的NAntContrib任务。很多时候,它是osql.exe的一个非常好的替代品。
  4. 也许通过尝试其中的一些,你可以缩小到底发生了什么。在评论中发布您的发现,我将很乐意尝试和帮助。

答案 1 :(得分:0)

我想你可能想尝试参数的ORDER ......我似乎记得OSQL对参数顺序的敏感性过去曾被咬过。

这就是我现在所拥有的......抱歉。

答案 2 :(得分:0)

我猜%3仅扩展为“-U”。

可能这可以通过

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

或者将属性值设置为包含双引号。

评论后更新:

请参阅this article,了解如何从shell变量中删除引号,并应用于第3个参数。