
Uso de Select Into en un Filegroup
La instrucción Select permite extraer la información guardada en las tablas, en ocasiones es necesario conservar los datos de una consulta y para eso podemos crear una tabla con el resultado de la consulta usando la opción Into (Ver Opciones de Select) seguido del nombre de la tabla que generalmente puede ser una tabla de uso temporal (Ver Tablas Temporales). También se puede guardar el resultado de una consulta en una vista, la bondad de la vista es que se actualizará cuando las tablas de las que se creó esta se actualicen.
Por otro lado, los archivos de una base de datos (Ver Archivos de base de datos) están ordenados en Grupos de archivos (Ver Grupos de archivos), esto permite que podamos elegir la ubicación y nombre del archivos, tamaño inicial, tamaño máximo y crecimiento de cada uno de los archivos de la base de datos al crearla (Ver Crear Base de datos) y también modificando la base de datos (Ver Modificación de la Base de datos: Grupos y archivos).
Una buena práctica es que los objetos temporales se creen en un grupo cuyos archivos estén ubicados en uno de los discos más rápidos y donde exista mas espacio, es posible dirigir la creación de las tablas generadas de manera temporal con la opción Into de la instrucción Select usando la opción On NombreGrupo.
Versión:
Válido desde SQL Server 2016 en adelante.
Permisos:
Necesita el permiso de Create Table
Crear tablas en un grupo de archivos específico
Sintaxis para create table
Select Campo1, Campo2, … into TablaTemporal on NombreGrupo
from TablaOrigen …
Note después del uso de la opción into el nombre del grupo donde se creará la tabla. Ver Select
Ejemplo
Usando la base de datos Northwind
use Northwind
go
Agregar un grupo de archivos y luego un archivo en la unidad E:
El grupo
Alter database Northwind add filegroup Temporal
go
El archivo
xp_Create_subdir ‘E:\Temp’
go
Alter database Northwind add file
(name = ‘Temporal’, filename = ‘E:\Temp\Temporal.ndf’)
to filegroup Temporal
go
Ejercicio 1
Generar una tabla con los productos que tengan unidades por atender
if exists (select name from sys.tables where name = 'ProductosPorAtender')
Begin
Drop table ProductosPorAtender
End
select P.ProductID As 'Codigo', P.ProductName As 'Descripcion',
P.UnitPrice As 'Precio', P.UnitsOnOrder As 'Por atender'
into ProductosPorAtender on Temporal
from Products As P
where P.UnitsOnOrder>0
order by [Por atender] desc
go
Ver los datos de la tabla
select * from ProductosPorAtender
go

Si se desea ver la ubicación de la tabla
sp_help ProductosPorAtender
go

Tambien al ver las propiedades de la tabla, en la opción Almacenamiento (Storage) se visualiza el grupo de archivos donde se ha creado.

Ejercicio 2
Crear una tabla con las Órdenes de 1997 donde se compraron mas de 200 productos
if exists (select name from sys.tables where name = 'Ordenes1997Mas200Productos') Begin Drop table Ordenes1997Mas200Productos End select O.OrderID As 'Orden', FORMAT(O.OrderDate,'dd/MM/yyyy') As 'Fecha', sum(D.Quantity) As 'Cantidad' into Ordenes1997Mas200Productos on Temporal from Orders As O join [Order Details] As D on O.OrderID = D.OrderID where YEAR(O.OrderDate) = 1997 Group by O.OrderID, FORMAT(O.OrderDate,'dd/MM/yyyy') having sum(D.Quantity)>200 go
Complementar los conocimientos con:
Agrupamientos en SQL Server
Uso de Joins
Funciones de agregado
Ver los registros
select * from Ordenes1997Mas200Productos
go

Limitaciones y restricciones
- No es posible especificar una variable de tabla o un parámetro con valores de tabla como la nueva tabla.
- No es posible usar SELECT … INTO para crear una tabla particionada, incluso cuando la tabla fuente está particionada. SELECT … INTO no usa el esquema de partición de la tabla de origen; en su lugar, la nueva tabla se crea en el grupo de archivos predeterminado. Para insertar filas en una tabla particionada, primero debe crear la tabla particionada y luego usar la instrucción INSERT INTO … SELECT … FROM.
- Los índices (Ver Índices), las restricciones (Ver Constraints) y los triggers (Ver Triggers) definidos en la tabla de origen no se transfieren a la nueva tabla, ni se pueden especificar en la instrucción SELECT … INTO. Si estos objetos son necesarios, puede crearlos después de ejecutar la instrucción SELECT … INTO.
- Especificar una cláusula ORDER BY (Ver Ordenamiento) no garantiza que las filas se inserten en el orden especificado.
- Cuando se incluye una columna dispersa en la lista de selección, la propiedad de la columna dispersa no se transfiere a la columna en la nueva tabla. Si esta propiedad es necesaria en la nueva tabla, modifique la definición de la columna después de ejecutar la instrucción SELECT … INTO para incluir esta propiedad.
- Cuando se incluye una columna calculada en la lista de selección, la columna correspondiente en la nueva tabla no es una columna calculada. Los valores en la nueva columna son los valores que se calcularon en el momento en que se ejecutó SELECT … INTO.