sábado, 27 de septiembre de 2014

SQL Server, tablas temporales

Algunas veces puede ser interesante, sobre todo para un programa informático, crear una tabla temporal en SQL Server  utilizarla para un propósito determinado y eliminarla.
Las tablas  temporales son como las tablas normales y corrientes de SQL Server pero al apagar el equipo desaparecen pues sólo existen en la memoria RAM.
Estas tablas se nombran con el símbolo # delante del nombre.


Para crear una tabla temporal basta con hacer una select o una vista de la tabla o tablas de la que queramos manejar los datos y tomar sólo los campos que nos interesan. Los ejemplos que voy a mostrar son muy sencillos pero se pueden complicar todo lo que queramos.

SQL Server, tablas temporales



Los pasos a seguir para crear una tabla temporal son estos:

1º- Hacemos un insert select

--introduce en una tabla temporal #DatosBancarios el resultado de la select de Dbo.tbCuentasBancarias
SELECT  strCodigoEntidad, strCodigoOficina,
strDigitosControl, strNumCuenta, strCuenta  ,
strDireccionSucursal  , strCMunicipio 
INTO Dbo.#DatosBancarios FROM Dbo.tbCuentasBancarias

2º Hacemos un INSERT INTO normal y corriente como si se tratara de una tabla más.

--una vez creada la tabla virtual se pueden introducir datos como si fuera una tabla cualquiera

INSERT INTO Dbo.#DatosBancarios 
(strCodigoEntidad, strCodigoOficina, strDigitosControl, strNumCuenta, strNombreEntidad, strDireccionSucursal, strCMunicipio)
VALUES ( '001', '0000', '0000', '00', '0000000000', '', '', '' )


3º También podemos hacer select, updates y deletes como si fuera una tabla más.

select * from Dbo.#DatosBancarios
delete Dbo.#DatosBancarios

4º Una vez hemos terminado de utilizarla podemos borrarla, si no lo hacemos desaparecerá de todos modos al apagar el equipo.

drop table Dbo.#DatosBancarios

A continuación muestro un ejemplo algo más complejo de un procedimiento almacenado que toma tres parámetros de entrada y da como resultado una select de varias tablas, entre las que utiliza una tabla temporal creada en el acto en el propio procedimiento almacenado.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

--Creación de un procedimiento almacenado con tres parámetros de entrada.

CREATE PROCEDURE [Dbo].[sp_InformeDatosBancarios]
      @strNIF           CHAR(14)
      ,@strCuenta_1     VARCHAR(255)
      ,@strCuenta_2     VARCHAR(255)
     
AS
DECLARE     @strCreateTable VARCHAR(8000)
DECLARE     @strSelectTable VARCHAR(8000)
DECLARE     @strSQLData VARCHAR(8000)

--Crea una tabla temporal con los datos del nuevo formato de número de cuenta bancaria

SET @strCreateTable = '
      IF NOT EXISTS (SELECT * FROM sysobjects WHERE name like ' + char(39) +  '#tb_InformeDatosBancarios' + char(39) + ')
            BEGIN
                  CREATE TABLE #tb_InformeDatosBancarios
                  ( CodigoOrden INTEGER IDENTITY(1,1) PRIMARY KEY
                  ,Nif VARCHAR(14) COLLATE SQL_Latin1_General_CP1_CI_AS
                  ,CodigoBIC CHAR(11) COLLATE SQL_Latin1_General_CP1_CI_AS
                  ,CodigoCuentaIBAN CHAR(20) COLLATE SQL_Latin1_General_CP1_CI_AS
                  ,NombreEntidad VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS
                  ,Direccion VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS
                  ,CodigoMunicipio CHAR(5) COLLATE SQL_Latin1_General_CP1_CI_AS
                  ,Alta BIT)
            END
'

--Inserta en la tabla temporal los datos

SET @strSQLData = '
            INSERT INTO #tb_InformeDatosBancarios
                (Nif, CodigoBIC, CodigoCuentaIBAN, NombreEntidad, Direccion, CodigoMunicipio, Alta)
            '
            + ' SELECT ' + CHAR(39) + @strNIF +  CHAR(39) + ', ' + @strCuenta_1
            + CASE WHEN LTRIM(RTRIM(@strCuenta_2)) <> '' THEN ' UNION ALL SELECT ' + CHAR(39) + @strNIF +  CHAR(39) + ', ' + @strCuenta_2 ELSE '' END
           
--Genera la salida con una select que toma varias tablas reales, y entre ellas la tabla temporal recien creada. Al terminar elimina la tabla temporal
     
SET @strSelectTable = '
            SELECT tbClientes.strNombre NombreApellidos 
            , case WHEN LEFT(tbClientes.strNIF, 5) = ' + char(39) + 'ES000' + char(39) + ' THEN CAST(Right(tbClientes.strNIF, 9) AS CHAR(14)) ELSE tbClientes.strNIF END Nif
            , CASE WHEN MunicipiosCliente.strDenominacion IS NULL THEN CAST(' + char(39) + char(39) + ' AS VARCHAR(255)) ELSE MunicipiosCliente.strDenominacion END LiteralMunicipioCliente
            , CASE WHEN dbo.tbProvincias.strDescripcion IS NULL THEN CAST(' + char(39) + char(39) + ' AS VARCHAR(255)) ELSE dbo.tbProvincias.strDescripcion END LiteralProvinciaCliente
            , tbClientes.strCPostal
            , tbClientes.strTelefonoOficial
            , DatosBancarios.CodigoBIC
            , DatosBancarios.CodigoCuentaIBAN
            , DatosBancarios.NombreEntidad
            , DatosBancarios.Direccion
            , CASE WHEN MunicipiosBanco.strDenominacion IS NULL THEN CAST(' + char(39) + char(39) + ' AS VARCHAR(255)) ELSE MunicipiosBanco.strDenominacion END LiteralMunicipioBanco
            , DatosBancarios.Alta
            FROM Dbo.tbClientes tbClientes
            LEFT JOIN dbo.tbMunicipios MunicipiosCliente ON MunicipiosCliente.strCodigoMunicipio = tbClientes.strCMunicipio
            LEFT JOIN dbo.tbProvincias ON dbo.tbProvincias.strProvincia = left(tbClientes.strCMunicipio,2)
            LEFT JOIN #tb_InformeDatosBancarios DatosBancarios ON DatosBancarios.Nif = tbClientes.strNif
                  LEFT JOIN dbo.tbMunicipios MunicipiosBanco ON MunicipiosBanco.strCodigoMunicipio = DatosBancarios.CodigoMunicipio
            WHERE tbClientes.strNIF = ' + char(39) +  @strNIF + char(39)  + ' ORDER BY CodigoOrden ASC
            DROP TABLE #tb_InformeDatosBancarios '

      EXECUTE (@strCreateTable + @strSQLData + @strSelectTable)
GO

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO






No hay comentarios:

Publicar un comentario