JDBC for SQL Server - Herong's Tutorial Examples - v3.14, by Herong Yang
"SELECT ... INTO" Statements
This section describes how to create a table and insert data rows with a special SELECT statement.
DML (Data Manipulation Language) statements are used to select, insert, update, or delete data records in tables.
SQL Server supports standard DML statements with some variations. It offers a special SELECT statement with an INTO clause, referred as SELECT INTO statement sometimes. It combines SELECT, CREATE TABLE and INSERT operations in a single statement. This statement should be treated as an update statement from the JDBC point of view, since it will not return any result set.
In this section, I want to use this SELECT INTO statement to build a new table with data from the existing sample table Customer. The new table will be called, Profile, in my schema, Herong. Here is the Java program that execute this SELECT INTO statement:
/* SelectInto.java * Copyright (c) HerongYang.com. All Rights Reserved. */ import java.sql.*; public class SelectInto { public static void main(String [] args) { Connection con = null; try { con = DriverManager.getConnection( "jdbc:sqlserver://localhost\\SQLEXPRESS;" + "user=herong;password=T0pSecret;" + "database=AdventureWorks2019"); Statement sta = con.createStatement(); // creating new table and insert data in a single statement int count = sta.executeUpdate( "SELECT TOP 10 BusinessEntityID, Title, FirstName, LastName," + " ModifiedDate" + " INTO Herong.Customer FROM Person.Person"); System.out.println("Number of rows inserted: "+count); // getting the data back ResultSet res = sta.executeQuery( "SELECT * FROM Herong.Customer"); System.out.println("List of Customers: "); while (res.next()) { System.out.println( " "+res.getString("Title") + ", "+res.getString("FirstName") + ", "+res.getString("LastName") + ", "+res.getDate("ModifiedDate")); } res.close(); sta.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } }
The output confirms that the SELECT INTO statement worked correctly:
herong> java -cp .;mssql-jdbc-9.4.1.jre16.jar SelectInto.java Number of rows inserted: 10 List of Customers: null, Ken, Sánchez, 2009-01-07 null, Terri, Duffy, 2008-01-24 null, Roberto, Tamburello, 2007-11-04 null, Rob, Walters, 2007-11-28 Ms., Gail, Erickson, 2007-12-30 Mr., Jossef, Goldberg, 2013-12-16 null, Dylan, Miller, 2009-02-01 null, Diane, Margheim, 2008-12-22 null, Gigi, Matthew, 2009-01-09 null, Michael, Raheem, 2009-04-26
The same program worked ok with JDBC Driver 4.2 running JDK 8. However, I am expecting the return value of the executeUpdate() call to be the number of rows inserted, which should be 10. But the output shows -1. It looks like Microsoft JDBC Driver 4.2 does not meet the JDBC specification.
herong> java -cp .:sqljdbc42.jar SelectInto Number of rows inserted: -1 List of Customers: null, Ken, Sánchez, 2009-01-07 null, Terri, Duffy, 2008-01-24 null, Roberto, Tamburello, 2007-11-04 null, Rob, Walters, 2007-11-28 Ms., Gail, Erickson, 2007-12-30 Mr., Jossef, Goldberg, 2013-12-16 null, Dylan, Miller, 2009-02-01 null, Diane, Margheim, 2008-12-22 null, Gigi, Matthew, 2009-01-09 null, Michael, Raheem, 2009-04-26
Previously, when I ran the same example program with JDK 1.6, JDBC Driver 1.0, and SQL Server 2005 Express Edition, the program gave correct result:
herong> java -cp .:sqljdbc.jar SelectInto Number of rows inserted: 10 List of Customers: 1, Orlando, Gee, 2004-10-13 2, Keith, Harris, 2004-10-13 3, Donna, Carreras, 2004-10-13 4, Janet, Gates, 2004-10-13 5, Lucy, Harrington, 2004-10-13 6, Rosmarie, Carroll, 2004-10-13 7, Dominic, Gash, 2004-10-13 10, Kathleen, Garza, 2004-10-13 11, Katherine, Harding, 2004-10-13 12, Johnny, Caprio, 2004-10-13
Table of Contents
JDBC (Java Database Connectivity) Introduction
Microsoft SQL Server Express Edition
Microsoft JDBC Driver for SQL Server
Microsoft JDBC Driver - Query Statements and Result Sets
Microsoft JDBC Driver - DatabaseMetaData Object
Microsoft JDBC Driver - DDL Statements
►Microsoft JDBC Driver - DML Statements
"INSERT INTO" Statements with INDENTITY Columns
SQL Server - PreparedStatement
SQL Server CLOB (Character Large Object) - TEXT
SQL Server BLOB (Binary Large Object) - BLOB
Using Connection Pool with JDBC
JDBC-ODBC Bridge Driver - sun.jdbc.odbc.JdbcOdbcDriver
JDBC-ODBC Bridge Driver - Flat Text Files
JDBC-ODBC Bridge Driver - MS Access