"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

 About This Book

 JDBC (Java Database Connectivity) Introduction

 JDK (Java SE) Installation

 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

"SELECT ... INTO" Statements

 "INSERT INTO" Statements

 "INSERT INTO" Statements with INDENTITY Columns

 "UPDATE" Statements

 "DELETE FROM" Statements

 SQL Server - PreparedStatement

 SQL Server CLOB (Character Large Object) - TEXT

 SQL Server BLOB (Binary Large Object) - BLOB

 JDBC-ODBC Bridge Driver - sun.jdbc.odbc.JdbcOdbcDriver

 JDBC-ODBC Bridge Driver - Flat Text Files

 JDBC-ODBC Bridge Driver - MS Access

 JDBC-ODBC Bridge Driver - MS SQL Server

 Archived Tutorials

 References

 Full Version in PDF/EPUB