> On Aug. 5, 2014, 7:27 p.m., Abraham Elmahrek wrote:
> > src/java/org/apache/sqoop/mapreduce/SQLServerExportDBExecThread.java, line 
> > 128
> > <https://reviews.apache.org/r/24242/diff/1/?file=650524#file650524line128>
> >
> >     Should this have a semicolon at the end of it?
> >     
> >     Also, does it make any sense to separate this out into its own 
> > statement?
> 
> Keegan Witt wrote:
>     I'm not sure I follow.  If I add a semicolon, this will be two statements 
> in a single PreparedStatement (which shouldn't be done).  I'd be OK breaking 
> them into separate PreparedStatements, but I didn't see where that would be 
> done.  The AsyncSqlRecordWriter interface just has getPreparedStatement() 
> which returns a single PreparedStatement, not a collection of 
> PreparedStatements to run.  What am I missing?
> 
> Abraham Elmahrek wrote:
>     Good points.
>     
>     It seems like there is a "configureConnection" method that can be 
> overriden in the parent class "SQLServerAsyncDBExecThread". Would that work?
> 
> Keegan Witt wrote:
>     This could work if you could tell SQL Sever through a connection 
> parameter passed to SQLServerDriver or some property set on 
> SQLServerConnection, but I didn't see a method that would do that.  
> Suggestions?
> 
> Abraham Elmahrek wrote:
>     You should be able to use separate statements. For example:
>     #1 Statement that executes: SET IDENTITY_INSERT ON
>     #2 Close statement
>     #3 Prepared Statement that executes batch stuff.
>     ...
>     
>     If the above doesn't work, then the solution you have is fine.

It didn't seem to work when I tested it as separate statements.  I'm not sure 
why; I would have thought the same JDBC connection would have meant the same 
SQL Server session.  Just to be sure my test was fair, here's what I tried in 
my GroovyConsole:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
def conn = DriverManager.getConnection("jdbc:sqlserver:// ..."))
conn.prepareStatement("SET IDENTITY_INSERT [testTable] ON").execute()
conn.prepareStatement("INSERT INTO [testTable] (k, v) VALUES (1, 1)").execute()

Thanks for asking about this though, it is a valid concern to want to do this 
once rather than as part of every batch query.


- Keegan


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/24242/#review49657
-----------------------------------------------------------


On Aug. 4, 2014, 1:48 p.m., Keegan Witt wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/24242/
> -----------------------------------------------------------
> 
> (Updated Aug. 4, 2014, 1:48 p.m.)
> 
> 
> Review request for Sqoop.
> 
> 
> Repository: sqoop-trunk
> 
> 
> Description
> -------
> 
> Adds an extra arg for SQL Server that runs SET IDENTITY_INSERT <table> ON 
> before exporting the data.
> 
> 
> Diffs
> -----
> 
>   src/docs/user/connectors.txt bba946a 
>   src/java/org/apache/sqoop/manager/SQLServerManager.java 534c0cc 
>   src/java/org/apache/sqoop/mapreduce/SQLServerExportDBExecThread.java 
> 1810ba8 
>   
> src/java/org/apache/sqoop/mapreduce/sqlserver/SqlServerExportBatchOutputFormat.java
>  cc69d77 
> 
> Diff: https://reviews.apache.org/r/24242/diff/
> 
> 
> Testing
> -------
> 
> Tested that change enables inserts on tables with identity (with SQL Server 
> 2005).
> 
> 
> Thanks,
> 
> Keegan Witt
> 
>

Reply via email to