Páginas

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