SQL Server 2008: "Construtores de Fila" el verdugo de UNION ALL
Si en SQL Server 2005, estabas cansado de usar escribir, escribir y escribir UNION ALL para realizar varias operaciones de inserción consecutivas o en bloques pues esto en SQL Server 2008 de alguna manera se ha solucionado con la implementación de una nueva característica llamada Constructores de Fila. Ahora podemos usar esta nueva funcionalidad y ahorrarnos el trabajo es esta escribiendo cientos de UNION ALL. Me explico con un ejemplo bastante práctico.
Primero: Crear una tabla.
CREATE TABLE [Production].[Document](
[DocumentID] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](50) COLLATE Latin1_General_CS_AS NOT NULL,
[FileName] [nvarchar](400) COLLATE Latin1_General_CS_AS NOT NULL,
[FileExtension] [nvarchar](8) COLLATE Latin1_General_CS_AS NOT NULL,
[Revision] [nchar](5) COLLATE Latin1_General_CS_AS NOT NULL,
[ChangeNumber] [int] NOT NULL CONSTRAINT [DF_Document_ChangeNumber] DEFAULT ((0)),
[Status] [tinyint] NOT NULL,
[DocumentSummary] [nvarchar](max) COLLATE Latin1_General_CS_AS NULL,
[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Document_ModifiedDate] DEFAULT (getdate()),
CONSTRAINT [PK_Document_DocumentID] PRIMARY KEY CLUSTERED
(
[DocumentID] ASC
)
) ON [PRIMARY]
Siguiente paso: Insertar Datos. En SQL Server 2005, podemos hacerlo de dos maneras.
La más trabajoso es esta:
INSERT INTO [Production].[Document]([Title],[FileName],[FileExtension],[Revision],[ChangeNumber],[Status],[DocumentSummary])
VALUES ('Installing Replacement Pedals','C:\Documents\Installing Replacement Pedals.doc','.doc','0',32,2,'Detailed instructions ...')
INSERT INTO [Production].[Document]([Title],[FileName],[FileExtension],[Revision],[ChangeNumber],[Status],[DocumentSummary])
VALUES ('Introduction 1','C:\Documents\Introduction 1.doc','.doc','4',28,2,NULL)
INSERT INTO [Production].[Document]([Title],[FileName],[FileExtension],[Revision],[ChangeNumber],[Status],[DocumentSummary])
VALUES ('Lubrication Maintenance','C:\Documents\Lubrication Maintenance.doc','.doc','2',11,1,'Guidelines and recommendations...')
INSERT INTO [Production].[Document]([Title],[FileName],[FileExtension],[Revision],[ChangeNumber],[Status],[DocumentSummary])
VALUES ('Seat Assembly','C:\Documents\Seat Assembly.doc','.doc','8',55,2,'Worn or damaged seats...')
Este problema (en SQL Server 2005) se soluciona usando UNION ALL, asi:
INSERT INTO [Production].[Document]([Title],[FileName],[FileExtension],[Revision],[ChangeNumber],[Status],[DocumentSummary])
SELECT 'Installing Replacement Pedals','C:\Documents\Installing Replacement Pedals.doc','.doc','0',32,2,'Detailed instructions ...'
UNION ALL
SELECT 'Introduction 1','C:\Documents\Introduction 1.doc','.doc','4',28,2,NULL
UNION ALL
SELECT 'Lubrication Maintenance','C:\Documents\Lubrication Maintenance.doc','.doc','2',11,1,'Guidelines and recommendations...'
UNION ALL
SELECT 'Seat Assembly','C:\Documents\Seat Assembly.doc','.doc','8',55,2,'Worn or damaged seats...'
Para SQL Server 2008, usando Constructores de Fila, podemos hacerlo asi:
INSERT INTO [Production].[Document](
[Title]
,[FileName]
,[FileExtension]
,[Revision]
,[ChangeNumber]
,[Status]
,[DocumentSummary]
)
VALUES ('Installing Replacement Pedals','C:\Documents\Installing Replacement Pedals.doc','.doc','0',32,2,
'Detailed instructions ...'),
('Introduction 1','C:\Documents\Introduction 1.doc','.doc','4',28,2,NULL),
('Lubrication Maintenance','C:\Documents\Lubrication Maintenance.doc','.doc','2',11,1,
'Guidelines and recommendations...'),
('Seat Assembly','C:\Documents\Seat Assembly.doc','.doc','8',55,2,'Worn or damaged seats...')
Fijate que no tenemos que usar UNION ALL, ahorrándonos (como ya dije, y vuelvo a repetir...) mucho trabajo de estar escribiendo cientos de UNION ALL en el caso de desear insertar masivamente. Está demás decir, que la performance mejorará ya que será inserción directa.
Kill "UNION ALL" para este tipo de operaciones! :D.
Saludos,