El siguiente procedimiento almacenado, surge como herramienta para importar datos de TABLAS entre diferentes Bases de Datos SQL Server, que se presumen tienen la misma estructura.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: YoRcH
-- Create date: 19/06/2014
-- Description: Obtiene en Texto INSERT INTO para una tabla
-- =============================================
ALTER PROCEDURE [dbo].[usp_InsertInto]
@esquema NVARCHAR(255) = '',
@tabla NVARCHAR(255) = '',
@desdeBD NVARCHAR(255) = ''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cCampo VARCHAR(MAX)
DECLARE @cFields VARCHAR(MAX)
SET @cFields = ''
DECLARE Cur_Campos CURSOR LOCAL FORWARD_ONLY FOR
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla)
AND is_computed = 0
OPEN Cur_Campos
FETCH Cur_Campos INTO @cCampo
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @cFields = @cFields + @cCampo + ','
FETCH Cur_Campos INTO @cCampo
END -- Fin del bucle WHILE
CLOSE Cur_Campos
DEALLOCATE Cur_Campos
-- SI TIENE IDENTITITY
PRINT 'BEGIN TRY'
PRINT ' TRUNCATE TABLE ' + @esquema + '.' + @tabla
PRINT 'END TRY'
PRINT 'BEGIN CATCH'
PRINT ' DELETE FROM ' + @esquema + '.' + @tabla
PRINT 'END CATCH'
IF EXISTS(SELECT NAME FROM sys.columns WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla) and is_identity = 1) BEGIN
PRINT 'SET IDENTITY_INSERT ' + @esquema + '.' + @tabla + ' ON'
END
SET @cFields = SUBSTRING(@cFields,1, LEN(@cFields)-1)
PRINT 'INSERT INTO ' + @esquema + '.' + @tabla + '(' + @cFields + ')'
PRINT 'SELECT ' + @cFields + ' FROM ' + @desdeBD + '.' + @esquema + '.' + @tabla
IF EXISTS(SELECT NAME FROM sys.columns WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla) and is_identity = 1) BEGIN
PRINT 'SET IDENTITY_INSERT ' + @esquema + '.' + @tabla + ' OFF'
END
PRINT ''
END
Ejemplo de Uso:
EXECUTE usp_InsertInto 'dbo','tabla','BD'
Donde: 'dbo' es el esquema, 'tabla' es la tabla que queremos llenar y 'BD' es la Base de Datos de donde se traerán los datos; el procedimiento regresa:
BEGIN TRY
TRUNCATE TABLE dbo.tabla
END TRY
BEGIN CATCH
DELETE FROM dbo.tabla
END CATCH
SET IDENTITY_INSERT dbo.tabla ON
INSERT INTO dbo.tabla(id_variable,descripcion,descripcion_larga,id_udm,id_modulo,id_systema,query,cantidad,valor,resultado,inactivo)
SELECT id_variable,descripcion,descripcion_larga,id_udm,id_modulo,id_systema,query,cantidad,valor,resultado,inactivo FROM BD.dbo.tabla
SET IDENTITY_INSERT dbo.tabla OFF
Estas líneas solamente se copian y pegan en el cliente de SQL Server y se ejecutan, si las tablas tienen la misma estructura, debe funcionar. Primero trata de truncar la tabla, si no puede entonces ejecuta un DELETE, si la tabla tiene un IDENTITY lo desactiva para luego ejecutar el INSERT INTO y posteriormente vuelve a activar el IDENTITY.
miércoles, 17 de septiembre de 2014
Parsear Fórmulas o Queries en SQL Server 2008
Este Procedimiento Almacenado, parsea una formula o ejecuta un query y regresa el resultado en un decimal, en caso de que no pueda parsear o ejecutar el comando, regresará NULL.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: YoRcH
-- Create date: 25 JUN 2010
-- Description: Parsear Formulas para Nomina
-- =============================================
ALTER PROCEDURE [Global].[usp_parseFormula]
@CFORMULA NVARCHAR(MAX)
,@CXML NVARCHAR(MAX)
,@nResultado DECIMAL(12,2) OUTPUT
AS
BEGIN
DECLARE @CVARIABLE AS VARCHAR(MAX)
DECLARE @NVALOR AS DECIMAL(12,2)
DECLARE @nXmlDoc INT
DECLARE @Parametros NVARCHAR(255)
DECLARE @rc INT
SET @CXML = '' + @CXML + ' ' -- CERRAR TABLA DE VARIABLES XML
-- Cargar XML de Variables
EXEC sp_xml_preparedocument @nXmlDoc OUTPUT, @CXML
BEGIN TRY
-- Crear Cursor
DECLARE Cur_Variables CURSOR LOCAL FORWARD_ONLY FOR
SELECT VARIABLE, VALOR
FROM OPENXML (@nXmlDoc, '/ROOT/TVARIABLES',2)
WITH (VARIABLE varchar (255), VALOR DECIMAL(12,2))
OPEN Cur_Variables
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
WHILE (@@FETCH_STATUS = 0) BEGIN -- Ciclo de Variables
SET @CFORMULA = REPLACE (@CFORMULA, @CVARIABLE, @NVALOR)
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
END
CLOSE Cur_Variables
DEALLOCATE Cur_Variables
SET @Parametros = '@nResultado DECIMAL(12,2) OUTPUT';
SET @CFORMULA = 'SELECT @nResultado = (' + @CFORMULA + ')'
SET @CFORMULA = REPLACE (@CFORMULA, '--', '+') -- QUITAR SIGNOS DE -
-- Parsear Formula
BEGIN TRY
EXEC @rc = sp_executesql @CFORMULA, @Parametros, @nResultado OUTPUT;
IF @rc <> 0 BEGIN
SET @nResultado = NULL
END
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
EXECUTE sp_xml_removedocument @nXmlDoc
END -- SP
Ejemplo de Uso:
DECLARE @RC int
DECLARE @CFORMULA nvarchar(max)
DECLARE @CXML nvarchar(max)
DECLARE @nResultado decimal(12,2)
DECLARE @tVariables Table (VARIABLE varchar (255), VALOR DECIMAL(12,2))
INSERT INTO @tVariables VALUES ('W', 2)
INSERT INTO @tVariables VALUES ('X', -2)
INSERT INTO @tVariables VALUES ('Y', -3)
INSERT INTO @tVariables VALUES ('Z', 5)
-- PASAR TABLA A XML
SET @CXML = (SELECT VARIABLE
,VALOR
FROM @tVariables AS TVARIABLES
FOR XML AUTO, ELEMENTS)
EXECUTE @RC = [Global].[usp_parseFormula] '(X-Y-Z-W)*-W', @CXML, @nResultado OUTPUT
SELECT @nResultado AS RESULTADO
El resultado es 12.00.
Solo se debe definir una nomenclatura correcta para los nombre de las variables, para que no se traslapen con nombres de columnas o funciones.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: YoRcH
-- Create date: 25 JUN 2010
-- Description: Parsear Formulas para Nomina
-- =============================================
ALTER PROCEDURE [Global].[usp_parseFormula]
@CFORMULA NVARCHAR(MAX)
,@CXML NVARCHAR(MAX)
,@nResultado DECIMAL(12,2) OUTPUT
AS
BEGIN
DECLARE @CVARIABLE AS VARCHAR(MAX)
DECLARE @NVALOR AS DECIMAL(12,2)
DECLARE @nXmlDoc INT
DECLARE @Parametros NVARCHAR(255)
DECLARE @rc INT
SET @CXML = '
-- Cargar XML de Variables
EXEC sp_xml_preparedocument @nXmlDoc OUTPUT, @CXML
BEGIN TRY
-- Crear Cursor
DECLARE Cur_Variables CURSOR LOCAL FORWARD_ONLY FOR
SELECT VARIABLE, VALOR
FROM OPENXML (@nXmlDoc, '/ROOT/TVARIABLES',2)
WITH (VARIABLE varchar (255), VALOR DECIMAL(12,2))
OPEN Cur_Variables
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
WHILE (@@FETCH_STATUS = 0) BEGIN -- Ciclo de Variables
SET @CFORMULA = REPLACE (@CFORMULA, @CVARIABLE, @NVALOR)
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
END
CLOSE Cur_Variables
DEALLOCATE Cur_Variables
SET @Parametros = '@nResultado DECIMAL(12,2) OUTPUT';
SET @CFORMULA = 'SELECT @nResultado = (' + @CFORMULA + ')'
SET @CFORMULA = REPLACE (@CFORMULA, '--', '+') -- QUITAR SIGNOS DE -
-- Parsear Formula
BEGIN TRY
EXEC @rc = sp_executesql @CFORMULA, @Parametros, @nResultado OUTPUT;
IF @rc <> 0 BEGIN
SET @nResultado = NULL
END
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
EXECUTE sp_xml_removedocument @nXmlDoc
END -- SP
Ejemplo de Uso:
DECLARE @RC int
DECLARE @CFORMULA nvarchar(max)
DECLARE @CXML nvarchar(max)
DECLARE @nResultado decimal(12,2)
DECLARE @tVariables Table (VARIABLE varchar (255), VALOR DECIMAL(12,2))
INSERT INTO @tVariables VALUES ('W', 2)
INSERT INTO @tVariables VALUES ('X', -2)
INSERT INTO @tVariables VALUES ('Y', -3)
INSERT INTO @tVariables VALUES ('Z', 5)
-- PASAR TABLA A XML
SET @CXML = (SELECT VARIABLE
,VALOR
FROM @tVariables AS TVARIABLES
FOR XML AUTO, ELEMENTS)
EXECUTE @RC = [Global].[usp_parseFormula] '(X-Y-Z-W)*-W', @CXML, @nResultado OUTPUT
SELECT @nResultado AS RESULTADO
El resultado es 12.00.
Solo se debe definir una nomenclatura correcta para los nombre de las variables, para que no se traslapen con nombres de columnas o funciones.
Suscribirse a:
Entradas (Atom)