使用ANT SQL任务调用时,sql脚本执行失败

时间:2015-01-08 18:07:21

标签: sql sql-server tsql ant

有一个SQL文件,其中包含一些Transact SQL语句和一些普通表查询,如下所示:

IF NOT EXISTS (SELECT * FROM [dbo].[SYSTEM_PROPERTIES] WHERE SYS_PROP = 'ABC')
BEGIN
DECLARE @SYS_PROP_ID INT;
INSERT INTO SYSTEM_PROPERTIES (...,....,...) values ('...','...','...');
SELECT    -------;
INSERT INTO ------;
END
GO

IF EXISTS (SELECT * FROM [dbo].[TEMPLATE] WHERE TPL_NAME='....' )
UPDATE [dbo].[TEMPLATE] SET [...] = 'Y' WHERE TPL_NAME='.....'
GO 

当我直接在数据库上执行此脚本时,它可以正常工作。当通过ANT SQL任务调用相同的脚本时,它失败并出现以下错误:

 com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'INT'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)

这是Ant任务:

<sql   driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"   url="---------"
userid="--"   password="---"  keepformat="true" print="true" >
 <classpath>
    <pathelement location="/lib/sqljdbc4.jar"/>
    <pathelement location="/lib/ojdbc14.jar"/>
 </classpath>
<transaction  src="${dbscript.location}/dbscript.sql"/>
</sql>

为什么从ANT SQL调用脚本失败?

2 个答案:

答案 0 :(得分:2)

花了很多时间后,我终于能够解决这个问题了。通过ANT SQL任务调用任何Transact SQL语句时,&#34 ;;&#34;不应指定分隔符。从SQL Management Studio或sqlcmd执行SQL语句时,使用这些分隔符不会导致任何问题。 另外,正如上面的注释中所指出的,当通过ANT SQL运行脚本时,GO语句也是不可接受的。

答案 1 :(得分:0)

SQL Ant任务支持以下属性,允许您在脚本中使用分号,实际上允许您运行复杂的脚本,如PL / SQL或存储过程:

  • 分隔符
  • delimitertype

在你的任务中一起使用它们:

<sql ...
    delimiter="/"
    delimitertype="row"
    ... 
/>

在这个例子中,任何&#39 ;;&#39;将被&#39; /&#39;

取代

有关详细信息,请查看ANT文档here