USE [Test]]
GO
IF OBJECT_ID('TempTable', N'U') IS NOT NULL
DROP TABLE TempTable
GO
CREATE TABLE TempTable
(
[id] INT IDENTITY(1,1) NOT NULL,
[index] INT,
[valor] NVARCHAR(50) NULL,
[modificado] NVARCHAR(50) NULL,
[original] NVARCHAR(50) NULL
)
GO
DECLARE @ORIGINAL NVARCHAR(50);
DECLARE @MODIFICADO NVARCHAR(50);
DECLARE @job NVARCHAR(50);
DECLARE @INDEX INT = 0;
DECLARE @VALOR NVARCHAR(50) = 0;
SELECT @ORIGINAL = COLUMNB FROM dbo.Table_3 WHERE ID = 7; --19,2,3,14,15,16
INSERT INTO TempTable([valor], [modificado], [original]) VALUES (@VALOR, RTRIM(LTRIM(@ORIGINAL)), RTRIM(LTRIM(@ORIGINAL)))
WHILE ((SELECT LEN([modificado]) from TempTable where id = (select MAX(id) from TempTable)) > 0)
BEGIN
BEGIN TRY
SET @job = (SELECT [modificado] from TempTable where id = (select MAX(id) from TempTable))
SET @VALOR = SUBSTRING(RTRIM(LTRIM(@job)), 1 , CHARINDEX(N',', RTRIM(LTRIM(@job))) - 1);
SET @INDEX = CHARINDEX(N',', @job);
SET @MODIFICADO = SUBSTRING(RTRIM(LTRIM(@job)), @INDEX + 1, LEN(RTRIM(LTRIM(@job))));
IF (((SELECT [index] from TempTable where id = (select MAX(id) from TempTable)) = 0))
BEGIN
INSERT INTO TempTable([index], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@job)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
BREAK
END
ELSE
INSERT INTO TempTable([index], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@VALOR)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
CONTINUE
END TRY
BEGIN CATCH
INSERT INTO TempTable([index], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@job)), 0, RTRIM(LTRIM(@ORIGINAL)))
BREAK
END CATCH;
END
GO
|
- Primero verificamos que no exista una tabla que usaremos como tabla temporal Dentro de la base de datos, de existir procedemos a borrarla
IF OBJECT_ID('TempTable', N'U') IS NOT NULL
DROP TABLE TempTable
GO
- Creamos nuestra tabla de datos el cual usaremos como tabla temporal.
CREATE TABLE TempTable
(
[id] INT IDENTITY(1,1) NOT NULL,
[index de la coma anterior] INT,
[valor] NVARCHAR(50) NULL,
[modificado] NVARCHAR(50) NULL,
[original] NVARCHAR(50) NULL
)
GO
- Declaramos la variable que serviran de datos para la tabla asi como para poder ir procesando los valores.
DECLARE @ORIGINAL NVARCHAR(50);
DECLARE @MODIFICADO NVARCHAR(50);
DECLARE @job NVARCHAR(50);
DECLARE @INDEX INT = 0;
DECLARE @VALOR NVARCHAR(50) = 0;
- Extraemos el valor original de la base de datos.
SELECT @ORIGINAL = COLUMNB FROM dbo.Table_3 WHERE ID = 7;
-
Insertamos el valor original a la
tabla temporal. Note que la columna [original]
como la columna [modificado] tendran el mismo valor y la columna [valor]
tendra un valor inicial de cero(0) para la primera fila.
INSERT INTO TempTable([valor], [modificado], [original]) VALUES (@VALOR, RTRIM(LTRIM(@ORIGINAL)), RTRIM(LTRIM(@ORIGINAL)))
-
Utilizamos la palabra reservada de control de flujo WHILE, para establecer una
condición para la ejecución repetida de una instrucción o bloque de
instrucciones SQL. Las instrucciones se ejecutan repetidamente siempre que la
condición especificada sea verdadera. Se puede controlar la ejecución de
instrucciones en el bucle WHILE con las palabras clave BREAK y CONTINUE.
WHILE ((SELECT LEN([modificado]) from TempTable where id = (select MAX(id) from TempTable)) > 0)
BEGIN
BEGIN TRY
SET @job = (SELECT [modificado] from TempTable where id = (select MAX(id) from TempTable))
SET @VALOR = SUBSTRING(RTRIM(LTRIM(@job)), 1 , CHARINDEX(N',', RTRIM(LTRIM(@job))) - 1);
SET @INDEX = CHARINDEX(N',', @job);
SET @MODIFICADO = SUBSTRING(RTRIM(LTRIM(@job)), @INDEX + 1, LEN(RTRIM(LTRIM(@job))));
IF (((SELECT [index de la coma anterior] from TempTable where id = (select MAX(id) from TempTable)) = 0))
BEGIN
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@job)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
BREAK
END
ELSE
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@VALOR)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
CONTINUE
END TRY
BEGIN CATCH
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@job)), 0, RTRIM(LTRIM(@ORIGINAL)))
BREAK
END CATCH;
END
GO
-
Encerramos el bloque de relevancia dentro de una instrucion TRY....CATCH para
Implementa un mecanismo de control de errores para el procedimiento.
BEGIN TRY
SET @job = (SELECT [modificado] from TempTable where id = (select MAX(id) from TempTable))
SET @VALOR = SUBSTRING(RTRIM(LTRIM(@job)), 1 , CHARINDEX(N',', RTRIM(LTRIM(@job))) - 1);
SET @INDEX = CHARINDEX(N',', @job);
SET @MODIFICADO = SUBSTRING(RTRIM(LTRIM(@job)), @INDEX + 1, LEN(RTRIM(LTRIM(@job))));
IF (((SELECT [index de la coma anterior] from TempTable where id = (select MAX(id) from TempTable)) = 0))
BEGIN
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@job)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
BREAK
END
ELSE
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@VALOR)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
CONTINUE
END TRY
-
Dentro del bloque TRY....CATCH seteamos los valores de las variables, para poder
trabajarle, en caso de producirse algun error en el codigo la instrucion pasara
al bloque CATCH donde trataremos los errores. Notese el uso de las funciones:
para poder lograr nuestro cometido.
SET @job = (SELECT [modificado] from TempTable where id = (select MAX(id) from TempTable))
SET @VALOR = SUBSTRING(RTRIM(LTRIM(@job)), 1 , CHARINDEX(N',', RTRIM(LTRIM(@job))) - 1);
SET @INDEX = CHARINDEX(N',', @job);
SET @MODIFICADO = SUBSTRING(RTRIM(LTRIM(@job)), @INDEX + 1, LEN(RTRIM(LTRIM(@job))));
-
Luego una instrucion IF...ELSE determina que el valor de la columna [index de la
coma anterior] de la tabla temporar cumpla con la condicion , en caso contrario
se procesa en el bloque ELSE.
IF (((SELECT [index de la coma anterior] from TempTable where id = (select MAX(id) from TempTable)) = 0))
BEGIN
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@job)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
BREAK
END
ELSE
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@VALOR)), RTRIM(LTRIM(@MODIFICADO)), RTRIM(LTRIM(@ORIGINAL)))
CONTINUE
-
Por ultimo tenemos el bloque CATCH donde capturamos cualquier anomalia que se
encuentre en el codigo.
BEGIN CATCH
INSERT INTO TempTable([index de la coma anterior], [valor], [modificado], [original]) VALUES (@INDEX, RTRIM(LTRIM(@job)), 0, RTRIM(LTRIM(@ORIGINAL)))
BREAK
END CATCH;
|
Hola Agel, estoy tomando tu ejemplo para un query similar, ya logre separar el primer registro de mi resultado pero ahora necesito hacerlo para los demas esto creo que lo puedo hacer mediante un ciclo.
ResponderEliminarigual tu me puedas ayudar por favor.
Saludos.
Puede hacer uso de cursores para lograrlo
ResponderEliminarhttps://msdn.microsoft.com/es-es/library/ms180169(v=sql.120).aspx