Search code examples
javajdbcjtdscallable-statement

Can't execute SQL Server script with JTDS 1.3.1


Comrades, I need help! I can't execute a SQL Server script with JTDS driver version 1.3.1. Details below.

I've tried to delete some lines of SQL script, but nothing helps.

SQL script:

USE [SomeScheme]
    GO
    DECLARE @ID int
    , @Guid nvarchar(50)
    , @Name nvarchar(250)
    , @Caption nvarchar(250)
    , @Description nvarchar(max)

    SET @Description = NULL;

SET @Guid = 'EAID_4076F221_3910_4480_B49A_09621E214249';
SET @Name = 'datetime';
SET @Caption = 'datetime';
IF EXISTS(SELECT [Guid] FROM rdf.SimplePropertyTypes WHERE [Guid] = @Guid) 
BEGIN
SET @ID = (SELECT ID FROM rdf.SimplePropertyTypes WHERE [Guid]=@Guid)
UPDATE rdf.SimplePropertyTypes
SET Name = @Name
, Caption = @Caption
, [Description] = @Description
WHERE [Guid]=@Guid
END
ELSE
BEGIN
SET @ID = ISNULL((SELECT MAX(ID) FROM rdf.SimplePropertyTypes),0) + 1000
INSERT INTO rdf.SimplePropertyTypes(ID, [Guid], Name, Caption, [Description]) VALUES
(@ID, @Guid, @Name, @Caption, @Description);
END
SET @Description = NULL

Java code:

try (final Connection connection = sourceDataSource.getConnection();
     final CallableStatement callableStatement = connection.prepareCall(sql)) {
    callableStatement.executeUpdate();
}

Exception stack trace:

Caused by: java.sql.SQLException: Invalid JDBC escape syntax at line position 68 '=' character expected.
    at net.sourceforge.jtds.jdbc.SQLParser.mustbe(SQLParser.java:412)
    at net.sourceforge.jtds.jdbc.SQLParser.callEscape(SQLParser.java:554)
    at net.sourceforge.jtds.jdbc.SQLParser.escape(SQLParser.java:1009)
    at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:1178)
    at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:165)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.<init>(JtdsPreparedStatement.java:111)
    at net.sourceforge.jtds.jdbc.JtdsCallableStatement.<init>(JtdsCallableStatement.java:70)
    at net.sourceforge.jtds.jdbc.JtdsConnection.prepareCall(JtdsConnection.java:2426)
    at net.sourceforge.jtds.jdbc.JtdsConnection.prepareCall(JtdsConnection.java:2412)
    at org.apache.commons.dbcp.DelegatingConnection.prepareCall(DelegatingConnection.java:308)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareCall(PoolingDataSource.java:303)

Driver: JTDS 1.3.1

Need help!


Solution

  • GO is not allowed in preparedStatements, hence the answer is:

    try (final Connection connection = sourceDataSource.getConnection();
                 final PreparedStatement preparedStatement = connection.prepareStatement(sql.replaceAll(" GO\n", " "))) {
        preparedStatement.executeUpdate();
    }