2015-01-08 3 views
1

Существует SQL-файл, который содержит некоторые операторы Transact SQL в нем и некоторые простые запросы таблицы следующим образом:SQL терпит неудачу, когда вызывается с помощью ANT 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 

Когда я выполнить этот сценарий непосредственно в базе данных , он отлично работает. Когда же скрипт вызывается через АНТ задачей 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) 

Это муравей задача:

<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> 

Почему сценарий сбиваться при вызове из АНТ SQL?

+0

Снимите 'GO' – billinkc

+0

@billinkc, спасибо за ответ. Ошибка, которую я вижу, находится прямо в начале скрипта (строка 3) в приведенном выше скрипте. Как будет удаляться помощь GO в этом случае? – user811433

+1

Мое предположение заключается в том, что GO, который не является частью TSQL, но вместо этого интерпретируется специально в командных инструментах (sqlcmd/ssms), вызывает загрязнение работ. Который объяснил бы, почему он работает, когда выполняется напрямую, но не здесь. Это теория, поэтому я прокомментировал вместо ответа – billinkc

ответ

2

Проведя много времени, я, наконец, смог решить проблему. При вызове любых операторов Transact SQL с помощью задачи ANT SQL, ";" разделители НЕ должны указываться. Наличие этих разделителей не вызовет каких-либо проблем при выполнении операторов SQL из студии управления SQL или sqlcmd. Кроме того, как указано в комментариях выше, оператор GO также неприемлем при запуске скрипта через ANT SQL.

задача
0

SQL Ant поддерживает следующие атрибуты, которые позволяют использовать точку с запятой в сценарии, и на самом деле позволяет запускать сложные сценарии, такие как PL/SQL или хранимые процедуры:

  • разделители
  • delimitertype

Используйте их вместе в вашей задаче, как это:

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

В этом примере любой ';' будет заменено на «/»

Для более подробной информации проверить ANT документов here

Смежные вопросы