Uso de On Filegroup en Select into

Uso de Select Into en un Filegroup

La instrucción Select permite extraer la información guardada en las tablas de la de datos, 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).

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 para el uso de Select into

Sintaxis
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

Ejemplos

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

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.



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

Ver los registros
select * from Ordenes1997Mas200Productos
go

Complementar los conocimientos con:

Agrupamientos en SQL Server
Uso de Joins
Funciones de agregado

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.