SQLShack (Español)
Este artículo cubrirá la sentencia SQL SELECT INTO incluida la sintaxis, parámetros y uso con múltiples tablas, grupos de archivos y una condición WHERE
Regularmente insertamos datos en tablas de SQL Server desde una aplicación o directamente en SSMS. Podemos insertar datos usando la instrucción INSERT INTO. Para hacer esto, ya deberíamos tener una tabla en su lugar para insertar datos en ella, ya que no podemos crear una tabla usando Insertar en la declaración.
Necesitamos hacer las siguientes tareas usando la instrucción INSERT INTO.
- Crear una estructura de tabla con los tipos de datos apropiados
- Insertar datos en ella
Pero la buena noticia es que podemos hacer ambas tareas juntos, elegantemente, usando la instrucción SQL SELECT INTO. Crea una estructura de tabla para las columnas devueltas por la instrucción Select.
Suponga que queremos actualizar muchos registros en una tabla. Podemos usar la instrucción SELECT INTO para crear una tabla de respaldo con la estructura existente a partir de la tabla fuente. Exploremos SELECT INTO en este artículo.
Sintaxis de la instrucción SELECT INTO
1
2
3
4
|
SELECCIONAR columna1, columna2 .. .ColumnN
INTO New_table
FROM tablas
;
|
Parámetros en la instrucción SELECT INTO
- Lista de columnas: Necesitamos especificar la columna que queremos recuperar e insertar en una nueva tabla
- New_table: Podemos especificar el nombre de la nueva tabla aquí. SQL Server crea una nueva tabla con las columnas mencionadas en la lista de columnas. No podemos reemplazar una tabla existente usando esto. El nombre de la tabla debe ser único
- Tablas: Contiene una tabla de donde queremos obtener los registros. También podemos tener varias tablas definidas aquí con la cláusula Join adecuada.
- Condiciones WHERE: Podemos filtrar registros usando la cláusula Where. Es una cláusula opcional
Exploremos la instrucción SQL SELECT INTO usando ejemplos.
Entorno:
En este ejemplo, estamos usando base de datos de muestra AdventureWorks2017. Supongamos que queremos seleccionar registros de la tabla y crear una nueva tabla usando la instrucción SELECT INTO. Queremos columnas seleccionadas solo en la nueva tabla. Ejecutemos una instrucción de selección en la tabla de empleados con las columnas que queremos tener.
Antes de ejecutar SQL SELECT INTO declaración, podemos verificar que la tabla Employee_Demo no existe en la base de datos AdventureWorks2017 usando el comando sp_help.
1
|
sp_help «..»
|
En la siguiente captura de pantalla, podemos ver que la tabla Employee_Demo no existe en mi base de datos.
Ejecute la siguiente consulta para crear una nueva tabla usando la instrucción SELECT INTO.
Obtenemos el siguiente mensaje de salida en Azure Data Studio. Puede observar que el número de filas afectadas es 10. En la consulta, seleccionamos los 10 registros principales de una tabla de empleados.
Podemos acceder a los datos de la tabla Employee_Demo recién creada y verificar que contiene los mismos registros que en nuestra declaración de selección anterior.
No especificamos ninguna propiedad de columna en la instrucción SQL SELECT INTO. Comparemos las columnas de la tabla de origen y destino y sus propiedades.
Podemos ejecutar el comando sp_help «tablename» en las tablas Employee y Employee_Demo. Copié la salida de ambas tablas en Excel (para las columnas seleccionadas). En la siguiente captura de pantalla, puede ver que el tipo de datos de la columna y sus propiedades son similares.
En la declaración SQL SELECT INTO anterior , preparamos una tabla de destino (Employee_Demo) a partir de algunas columnas en la tabla de origen (Empleado).
Creemos otra tabla con todas las columnas en una tabla de empleados con la siguiente consulta.
En la salida, podemos ver que insertó 290 filas en la tabla Employee_All.
Hemos verificado que SELECT INTO declaración crea una nueva tabla con columnas especificadas en la lista de columnas. También crea un tipo de datos similar en la tabla de destino.
Supongamos que tenemos claves primarias y externas en la tabla de origen. ¿Crea una clave primaria y una clave externa también similar a la tabla de origen? No, la instrucción SQL SELECT INTO no crea ninguna clave en la tabla de destino. Si queremos, podemos definir claves en la tabla de destino. Verifiquemos esto en la siguiente sección.
En mi ejemplo anterior, la tabla Empleado contiene claves primarias y externas definidas en ella. Podemos obtener una lista de claves existentes usando la vista INFORMATION_SCHEMA. Ejecute el siguiente código y devolverá las claves primarias y externas existentes en la tabla de empleados.
Podemos ver que la tabla de empleados contiene claves primarias y externas.
Copiamos todas las columnas en Employee_All de la tabla Employee. Necesitamos verificar la clave primaria y externa en la tabla de destino ahora.
Podemos ver que no contiene ninguna clave en la tabla de destino. Nos da flexibilidad para definir claves en la tabla de destino.
SQL SELECT INTO – Insertar datos de varias tablas
En ejemplos anteriores, creamos una tabla utilizando la instrucción SELECT INTO de una sola tabla Employee. También podemos unir varias tablas y usar la instrucción SELECT INTO para crear una nueva tabla con datos también. En esta sección, queremos unir varias tablas. En la siguiente consulta, unimos las siguientes tablas en AdventureWorks2017.
Ejecute la siguiente consulta. Proporciona resultados de varias tablas según la condición de unión y las columnas mencionadas.
Ejecuta una consulta y seguimos el resultado de la instrucción SQL SELECT INTO.
Queremos crear una tabla con los datos devueltos utilizando la tabla anterior. Ejecutemos la instrucción SQL SELECT INTO.
Crea. tabla e inserte datos en ella. Podemos verificar los registros de esta tabla mediante la instrucción select.
Podemos ver que puede unir varias tablas y crear una salida tabla usando la instrucción SELECT INTO.
No es necesario que nos encarguemos de definir los tipos de datos para la tabla de destino. Si queremos crear una tabla manualmente, necesitamos mirar el tipo de datos de cada columna y definir el tipo de datos en consecuencia. Si hay una discrepancia entre los tipos de datos, puede recibir un mensaje de error como el siguiente.
Error 1: debido a una discrepancia en los tipos de datos
Msj 245, Level 16, State 1 , Línea 1
Error de conversión al convertir el valor varchar GG al tipo de datos int.
Error 2: Msg 8152, Nivel 16, Estado 30, Línea 2
Cadena o los datos binarios se truncarían.
No obtenemos estos errores al insertar datos utilizando la instrucción SQL SELECT INTO. Sin embargo, no podemos insertar datos en tablas existentes usando este método.
SELECT INTO – Especificar grupo de archivos
En secciones anteriores, exploramos que podemos crear una nueva tabla e insertar datos en ella utilizando la instrucción SQL SELECT INTO de tablas existentes. Crea una tabla solo en el grupo de archivos predeterminado. No podemos especificar un grupo de archivos en particular hasta SQL Server 2016. En SQL Server 2017, podemos especificar un grupo de archivos en particular en el que se debe crear una nueva tabla. SQL Server crea una nueva tabla en ese grupo de archivos de tabla Verificar en particular. Si no especificamos ningún grupo de archivos en SQL Server 2017 y superior, crea una tabla en el grupo de archivos predeterminado.
Nota: No podemos especificar grupos de archivos en SQL SELECT INTO para SQL Server 2016 y antes.
Agreguemos un nuevo grupo de archivos en la base de datos AdventureWorks2017. Haga clic con el botón derecho en la base de datos y vaya a Grupos de archivos.
En esta página de Grupo de archivos, haga clic en Agregar grupo de archivos y especifique un nombre para el grupo de archivos.
Ahora, haga clic en Archivos y enumera los archivos de base de datos existentes (archivo de datos y registro), en esta página, agregue un nuevo archivo de datos y especifique FileGroup de la lista desplegable. Debería ser FileGroup que creamos ahora.
Queremos crear una tabla SQL en INSERTFILE Filegroup. No hemos configurado este grupo de archivos como grupo de archivos predeterminado.
En la siguiente consulta, puede ver que especificamos el nombre del grupo de archivos usando la cláusula ON. Funciona de manera similar a una instrucción SELECT INTO de SQL normal con una diferencia en un grupo de archivos.
1
2
3
|
seleccionar * en person.person_temp
EN INSERTFILE –FILEGROUP NOMBRE
de person.person
|
Una vez creada la tabla, ejecute un comando sp_help en esta tabla recién creada. En la siguiente captura de pantalla, podemos verificar que la tabla se encuentra en INSERTFILE FileGroup. Es el grupo de archivos que creamos anteriormente.
También podemos verificar esto en las propiedades de la tabla. Haga clic con el botón derecho en una tabla en SSMS. En la sección Almacenamiento, podemos ver el grupo de archivos deseado.
SELECT INTO con una condición Where
Suponga que queremos crear una tabla con una instrucción SELECT INTO de SQL con pocos registros en ella. Podemos usar una cláusula Where similar a una instrucción select.En la siguiente consulta, queremos crear una tabla person.person_WC para la persona cuyo apellido es como% Duf%.
1
2
3
4
|
seleccionar * en person.person_WC
ON INSERTFILE – Verificar tabla Grupo de archivos
de person.person
donde Apellido como «% Duf%»
|
Conclusión
En este artículo, exploramos el SQL Instrucción SELECT INTO y sus escenarios de uso. Es un comando útil para crear una copia de una tabla sin especificar tipos de datos.
- Autor
- Publicaciones recientes
Es el creador de una de las mayores colecciones de artículos en línea gratuitos sobre un solo tema, con su serie de 50 partes sobre los grupos de disponibilidad AlwaysOn de SQL Server. Basado en su contribución a la comunidad de SQL Server, ha sido reconocido con varios premios, incluido el prestigioso «Mejor autor del año» de forma continua en 2020 y 2021 en SQLShack.
Raj siempre está interesado en nuevos desafíos, así que si necesita consultoría ayuda sobre cualquier tema cubierto en sus escritos, puede ser contactado en [email protected]
Ver todas las publicaciones de Rajendra Gupta
- Realización de actualizaciones de versiones menores y mayores para AWS RDS SQL Server: 29 de enero de 2021
- Implementación de instancias de AWS RDS PostgreSQL: 27 de enero de 2021
- Migración de sus bases de datos SQL locales a AWS RDS SQL Server mediante AWS DMS: 25 de enero , 2021