2016-05-09 8 views
0

SQL Server 2008にデータを挿入するためにJavaコードを使用しています。エラーが発生しています。一括挿入 - ''近くの構文が正しくありません。 SQL Server 2008で

Statement st = null; 
    Connection con = null; 
    String loadQuery = ""; 
    Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver); 
    con =    DriverManager.getConnection(jdbc:sqlserver://11.11.112.123:1433;DatabaseName=test123, test, test); 
    st = con.createStatement(); 
loadQuery = "BULK INSERT testres FROM 'D:\RTTM\NTB\Data\GDW\Files\ACCif.csv' WITH (FIRSTROW=2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')"; 
System.out.println(loadQuery); 
st.executeUpdate(loadQuery); 

クエリ

BULK INSERT testres FROM 'D:\RTTM\NTB\Data\GDW\Files\ACCif.csv' WITH (FIRSTROW=2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n') 

エラー

Incorrect syntax near ' '. 

com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ' '. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:775) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:676) 
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4874) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeUpdate(SQLServerStatement.java:633) 
    at QueryCreation_sqlserver.readCsvUsingLoad(QueryCreation_sqlserver.java:225) 
    at QueryCreation_sqlserver.readCsvcoloumnname(QueryCreation_sqlserver.java:268) 
    at QueryCreation_sqlserver.main(QueryCreation_sqlserver.java:39) 
Incorrect syntax near ' '. 

データベースの詳細

Driver name: Microsoft SQL Server JDBC Driver 3.0 
Driver version: 3.0.1119.0 
Product name: Microsoft SQL Server 
Product version: 10.50.1600 

JDBCのjar詳細

sqljdbc4-3.0.jar 
+2

を見ている必要があり

二行ではなく、「\ nの」としてそれを送るあなたの本来の目的は、このクエリの作業を行いますが、SQL Studioの管理StudioなどのSQL Serverクライアントを使用して、それを実行するとき。私は、クエリの構文に問題があり、Javaコードやドライバには何もないと思います。 – vvs

+0

SQL Studio Managementで同じクエリが動作する – Jay

+0

その場合、Javaコードがクエリを正しく作成していない可能性があります。 javaでexecuteメソッドを呼び出す直前にクエリを印刷しようとしましたか? – vvs

答えて

0

あなたはD:\RTTM\NTB\Data\GDW\Files\ACCif.csvにバックスラッシュをエスケープすることはできますか?

+0

はい - D:\\ RTTM \\ NTB \\ Data \\ GDW \\ Files \\ ACCIF.csv – Jay

0
loadQuery = "BULK INSERT testres FROM 'D:\RTTM\NTB\Data\GDW\Files\ACCif.csv' WITH (FIRSTROW=2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')"; 

上記の文は、バックスラッシュをたくさん持っている、あなたが知っているだろうとJavaの文字列に「\」のエスケープシーケンスの開始を示すために使用されています。 loadQuery変数が内部的に使用されると、破壊されたSQLが起動されます。 は、だからあなたの構文エラーから

loadQuery = "BULK INSERT testres FROM 'D:\\RTTM\\NTB\\Data\\GDW\\Files\\ACCif.csv' WITH (FIRSTROW=2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\\n')"; 

の下に行うことができますが、最も可能性の高いクエリがで壊れる「\ n」の文字が広がっSQL文字列「」としてSQLインタプリタに提示されていることを私は疑うスタックトレースを提案しましたあなたはまた、この質問How to show special escape characters like LineBreak in Java output?

+0

SQL Server 2014でSAMEクエリが機能しています。 – Jay

+0

@Jay SQL Server 2008に対してJavaプログラムを通じてこのクエリを実行すると、それは実行されませんが、SQL Server 2014に対して実行されるその他の設定は変更されません。それは変だ。可能性があります バージョン間のSQLサーバーのバージョン/構文の互換性の問題 – vvs

+0

@ws SQL Server 2008 R2とSQL Server 2014についても混乱しています。 Jay、それが実行されているバージョン/実行されていないバージョン、Java/SSMSからテストされているかどうかを明確にしてください。 – Alex

関連する問題