有一个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调用脚本失败?
答案 0 :(得分:2)
花了很多时间后,我终于能够解决这个问题了。通过ANT SQL任务调用任何Transact SQL语句时,&#34 ;;&#34;不应指定分隔符。从SQL Management Studio或sqlcmd执行SQL语句时,使用这些分隔符不会导致任何问题。 另外,正如上面的注释中所指出的,当通过ANT SQL运行脚本时,GO语句也是不可接受的。
答案 1 :(得分:0)
SQL Ant任务支持以下属性,允许您在脚本中使用分号,实际上允许您运行复杂的脚本,如PL / SQL或存储过程:
在你的任务中一起使用它们:
<sql ...
delimiter="/"
delimitertype="row"
...
/>
在这个例子中,任何&#39 ;;&#39;将被&#39; /&#39;
取代有关详细信息,请查看ANT文档here