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.
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